我有一个 Rails 应用程序,其中有一组模型(我们称之为它们Events
),它们有一些共同的字段(、、、date
)title
,user_id
但是我需要一些“子类型”。ASalesEvent
可能有一个article_id
和一个amount
。一个InterviewEvent
可能有一个comments
字段。等等。
我知道我需要满足 3 个业务要求:
- 在某些情况下,我会想将它们
Events
作为一个整体来构建(即“Events
为该用户获取所有信息,并按时间顺序对它们进行排序,按月分组”) - 在其他情况下,我只需要“子类型”(“获取该用户出售的所有文章”)。
- 子类型的数量可能适中(仍待定,但我们估计大约 20 个,具体取决于用户反馈)
我正在思考如何构建表格以支持此模型。我提出了 5 种可能的方法来对此进行建模,但每种方法都有其自身的缺点。
- 选项 A:单独的表格-
sales_events
和interview_events
. 这将使 2) 非常简单,并且 3) 可行,但是 1) 实施起来会非常麻烦。 - 选项 B:单表继承。这将或多或少容易地解决 1) 和 2),但存在需要越来越多的可空字段的问题,这与 3) 不兼容
- 选项 C:使用
hstore
- 因为我们在生产中使用 Postgres,我们可以使用hstore - 我们将有一个由“类型”字符串字段控制的“数据”字段。这将解决 1)、2) 和 3),但将我们与 postgresql 联系在一起,并且我们将使用我们不太熟悉的技术实现关键业务对象。如果可能的话,我宁愿避免这种情况。 - 选项 D:带有多态链接的事件表
***_event_data
。我们基本上会有一个带有 type 和 event_data_id 的事件表,然后我们会有sale_event_data
,interview_event_data
等。这很好地满足了 1) 和 3),但是 2) 比其他方法有点弱,因为会有很多连接参与将事件与其数据联系起来。 - 选项 E:销售
has_one
:事件。这与选项 D 的作用相同,只是“与其他人的链接”位于“数据”部分。也解决了1)和3),也涉及到了2)中的一些join,但是看起来更“干净”了一些;这里没有多态关联,只有“常规” sql 关联。
现在我倾向于使用选项 E。但我想知道是否有人认为它有明显的劣势,或者其他选项中的一个更大的好处,或者我没有想到的更好的选择。