我正在为企业构建Ruby on Rails应用程序,并将使用ActiveRecord数据库。我的问题实际上与数据库架构有关,而且我应该在我的应用程序中组织所有不同的表和模型。所以,在App我的建筑都将有订单的数据库对于电子商务业务,销售产品通过2个不同的频道,订阅服务,他们挑选的产品和出售它一个固定的月租费和传统的电子商务渠道,在那里客户直接支付他们的产品。因此,基本上所有这些都被归类为订单模型,有两种类型的订单:订购订单和常规订单。
所以最初我以为我会在我的订单表中对所有这些活动进行分类,并包含一个字段'Type',表示它是订阅订单还是常规订单。我的问题是,我需要一些特定于每种类型的字段。例如,transaction_id,batch_id和sub_id是只有在订单类型是订阅时才会出现的所有字段,如果订单类型是常规的,则相反则不存在。
我的问题是,创建两个单独的表,一个用于订阅订单,一个用于常规订单,是否符合我的最佳利益?或者有没有一种方法,字段只能以Type字段为条件出现?我不想看到这么多的Nil值,例如,如果订单类型是常规订单。
对不起,这个问题并不像最佳实践和组织那样具有技术性。
谢谢, 晴天
答案 0 :(得分:2)
你所描述的是一种名为Single Table Inheritance的模式 - 也就是说,有一个表存储不同类型的具有不同行为的对象的数据。
一般来说,人们会告诉你不要这样做,因为它会导致你的数据库中出现很多空字段,从长远来看会影响性能。它看起来也很糟糕。
您应该将数据存储在单独的表中。如果您想获得想象力,可以尝试实现类表继承,其中每个子类实际上都有单独但连接的表。 ActiveRecord本身不支持此功能。 This gem和this gem也许可以帮到你,但我从来没有使用过,所以我不能给你一个坚定的建议。
答案 1 :(得分:0)
我会把所有订单都放在一张桌子里。您可以为“订阅订单信息”创建第二个表,该表仅包含列transaction_id,batch_id和sub_id以及将其链接回主订单表的主键。您仍然希望在主数据库中包含订单类型列,以便在调试时使其更容易一些。
答案 2 :(得分:0)
假设你正在使用Postgres,我可能会倾向于Hstore。
一些阅读:
http://www.devmynd.com/blog/2013-3-single-table-inheritance-hstore-lovely-combination
答案 3 :(得分:0)
创建一个名为order_type的整数列。
在模型中执行:
SUBSCRIPTION = 0
ONLINE = 1
...
它会比字符串更好地查询,无论何时你想调用一个,你都可以执行Order:SUBSCRIPTION。 创建两个+其他表,其外键等于订单中相应行的ID。
现在,您可以将所有共享数据保留在订单表中,以便于查询,以及其他表中的所有唯一数据,这样您就不会拥有臃肿的模型。