Rails - 具有多种价值类型的EAV模型?

时间:2012-08-21 14:28:45

标签: ruby-on-rails database ruby-on-rails-3 activerecord model

我目前有一个模型Feature,供其他各种模型使用;在此示例中,它将由客户使用。

为了保持灵活性,功能用于存储名字,姓氏,姓名,出生日期,公司注册号等内容。

你会注意到这个问题 - 虽然大多数都是字符串,但出生日期等功能最好存储在Date类型的列中(并且将是一个datepicker而不是视图中的文本输入)

如何最好地处理?目前我只有一个字符串列“value”;我考虑过使用多个值列(例如string_value,date_value),但这似乎并不是特别有效,因为每条记录中总会有一个空列。

非常感谢有关如何处理此事的任何建议 - 谢谢!

1 个答案:

答案 0 :(得分:3)

根据您的需要,我可以通过两种方式看到您的情况。我并不完全满意这些,但也许他们可以指出你正确的方向:

  1. 序列化所有内容
  2. Rails可以将任何对象存储为字节流,而在Ruby中,一切都是对象。因此理论上,您可以在数据库列中存储任何对象的字符串表示形式,包括字符串,日期时间甚至您自己的模型。 Marshal模块大多数时候都会为您处理这个问题,并允许您在对象有特殊需求时编写自己的序列化方法。

    优点:真正将任何内容存储在单个数据库列中。

    缺点:处理数据库中数据的能力很小 - 基本上不可能将此列用作存储以外的任何其他内容 - 您(可能)无法根据它对数据进行排序或过滤,因为格式不是数据库可识别的任何内容。

    1. 每种数据类型的列
    2. 这基本上是您在问题中建议的解决方案 - 确切地指出您可能需要存储的数据类型 - 您提到字符串和日期戳。如果没有那么多,那么简单地拥有每种类型的列并且仅将数据存储在其中一列中是可行的。您可以覆盖属性访问器函数以使用正确的列,并且从外部开始,功能将表现为.value就像您需要它一样。

      优点:只需要一张桌子。

      缺点:每条记录中至少有一个空值。

      1. 多个模型/表
      2. 你可以为你可能需要的每种功能制作一个模型 - TextFeature,DateFeature等。This guide on Multiple Table Inheritance传达了这个想法和方法。

        优点:没有空值 - 每条记录只包含它需要的列。

        缺点:复杂性。除了需要多个模型之外,如果您需要直接使用数据库中不同类型的功能,您可能会发现自己正在进行复杂的连接和联合。