【问题标题】:How to create an Order Model with a type field that dictates other fields如何使用指示其他字段的类型字段创建订单模型
【发布时间】:2014-02-16 04:45:24
【问题描述】:

我正在为企业构建一个 Ruby on Rails 应用程序,并将使用 ActiveRecord 数据库。我的问题确实与数据库架构有关,也是我应该在我的应用程序中组织所有不同表和模型的最佳方式。因此,我正在构建的应用程序将拥有一个电子商务企业的订单数据库,该企业通过 2 个不同的渠道销售产品,一个订阅服务,他们选择产品并以固定的月费销售,以及一个传统的电子商务渠道,其中客户直接为他们的产品付款。所以基本上虽然所有这些都被归类为订单模型,但有两种类型的订单:订阅订单和常规订单。

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

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

很抱歉,这个问题并不像它只是与最佳实践和组织有关的技术性问题。

谢谢, 晴天

【问题讨论】:

  • 附带说明,避免将任何字段命名为“类型”。 ActiveRecord 会大吃一惊。

标签: ruby-on-rails ruby activerecord architecture


【解决方案1】:

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

一般来说,人们会告诉你不要这样做,因为它会导致你的数据库中有很多空字段,这会长期影响性能。它也只是看起来很恶心。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      假设您使用的是 Postgres,我可能会倾向于使用 Hstore。

      一些阅读:

      http://www.devmynd.com/blog/2013-3-single-table-inheritance-hstore-lovely-combination

      https://github.com/devmynd/hstore_accessor

      【讨论】:

        【解决方案4】:

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

        在模型中做:

        订阅 = 0

        在线 = 1

        ...

        它会比字符串更好地查询,无论何时你想调用一个,你都会做 Order:SUBSCRIPTION。 使用与订单中相应行的 ID 相同的外键创建另外两个以上的表。

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

        【讨论】:

          猜你喜欢
          • 2019-04-15
          • 1970-01-01
          • 1970-01-01
          • 2021-09-21
          • 1970-01-01
          • 2013-07-19
          • 2022-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多