如何使用指示其他字段的类型字段创建订单模型

时间:2014-02-14 14:43:44

标签: ruby-on-rails ruby activerecord architecture

我正在为企业构建Ruby on Rails应用程序,并将使用ActiveRecord数据库。我的问题实际上与数据库架构有关,而且我应该在我的应用程序中组织所有不同的表和模型。所以,在App我的建筑都将有订单的数据库对于电子商务业务,销售产品通过2个不同的频道,订阅服务,他们挑选的产品和出售它一个固定的月租费和传统的电子商务渠道,在那里客户直接支付他们的产品。因此,基本上所有这些都被归类为订单模型,有两种类型的订单:订购订单和常规订单。

所以最初我以为我会在我的订单表中对所有这些活动进行分类,并包含一个字段'Type',表示它是订阅订单还是常规订单。我的问题是,我需要一些特定于每种类型的字段。例如,transaction_id,batch_id和sub_id是只有在订单类型是订阅时才会出现的所有字段,如果订单类型是常规的,则相反则不存在。

我的问题是,创建两个单独的表,一个用于订阅订单,一个用于常规订单,是否符合我的最佳利益?或者有没有一种方法,字段只能以Type字段为条件出现?我不想看到这么多的Nil值,例如,如果订单类型是常规订单。

对不起,这个问题并不像最佳实践和组织那样具有技术性。

谢谢, 晴天

4 个答案:

答案 0 :(得分:2)

你所描述的是一种名为Single Table Inheritance的模式 - 也就是说,有一个表存储不同类型的具有不同行为的对象的数据。

一般来说,人们会告诉你不要这样做,因为它会导致你的数据库中出现很多空字段,从长远来看会影响性能。它看起来也很糟糕。

您应该将数据存储在单独的表中。如果您想获得想象力,可以尝试实现类表继承,其中每个子类实际上都有单独但连接的表。 ActiveRecord本身不支持此功能。 This gemthis gem也许可以帮到你,但我从来没有使用过,所以我不能给你一个坚定的建议。

答案 1 :(得分:0)

我会把所有订单都放在一张桌子里。您可以为“订阅订单信息”创建第二个表,该表仅包含列transaction_id,batch_id和sub_id以及将其链接回主订单表的主键。您仍然希望在主数据库中包含订单类型列,以便在调试时使其更容易一些。

答案 2 :(得分:0)

答案 3 :(得分:0)

创建一个名为order_type的整数列。

在模型中执行:

SUBSCRIPTION = 0

ONLINE = 1

...

它会比字符串更好地查询,无论何时你想调用一个,你都可以执行Order:SUBSCRIPTION。 创建两个+其他表,其外键等于订单中相应行的ID。

现在,您可以将所有共享数据保留在订单表中,以便于查询,以及其他表中的所有唯一数据,这样您就不会拥有臃肿的模型。