5

通常要在数据库中创建/更改表,我使用迁移(手动运行rake db:migrate),然后在我的代码中使用 ActiveRecord。这非常酷,因为我不必担心 db 中数据的表示以及特定类型的 db(sqlserver、pg 或其他)。

但是现在客户希望自己能够即时创建“事物”,例如,他开始销售计算机,所以他想要一个界面,他可以在其中动态创建具有“名称、RAM、高清, ...”。在 db 中创建一个包含所有这些字段的单独表似乎很自然。但是我怎样才能在 RoR 中做到这一点并保留 ActiveRecord 的所有这些优点呢?

请建议。

4

2 回答 2

2

通常的方法是完全相反:

  • 有一个对象类型表
  • 每个对象类型都有一个字段名称表
  • 有一个非常大的表,其中包含任何类型的每个对象的所有自定义属性

这称为 EAV(实体属性值模型,请参阅http://en.wikipedia.org/wiki/Entity-attribute-value_model)。而且它的扩展性很差。

或者,您可以使用store文本列而不是大 EAV 表(请参阅http://api.rubyonrails.org/classes/ActiveRecord/Store.html),这样您就不必进行 EAV 典型的那些困难的属性检索. 您仍然需要将“对象类型”定义存储在某处,因此在构建表单和表格时可以使用预期的字段等。

这种方法的问题是您无法查询(where/join/select)这些属性,因为它们不是列。有很多解决方案:

  • 不要对这些属性进行过滤(嗯...)
  • 拥有能够进行分面搜索的外部搜索服务器
  • (正如@Amar 正确所说)使用文档数据库
  • 使用 postgreSQL 并使用hstore而不是简单的序列化列。
于 2012-11-06T09:28:35.373 回答
1

NoSQL 数据库(文档数据库 Mongodb,CouchDB)可以最适合这个或使用 redis。根据我的想法,您可以使用Vertical Table 概念尝试运行MySQL应用程序的 Rails 2.x Demo 。您可以尝试使用 Mongodb,检查是否需要。

于 2012-11-06T09:07:39.573 回答