rails中的键值数据库组织

时间:2013-10-01 10:32:32

标签: ruby ruby-on-rails-3 database-design key-value entity-attribute-value

我在rails模型上有一个用户ruby,用户名,密码字段。我想在该图像上添加编辑个人资料表格

image link

任何字段都应该有一个额外的sharebox(布尔值),或者用户想要根据字段分享他的个人资料信息。

组织这种模型的最佳方法是什么?理想情况下,这应该是像表一样的键值,用于单独存储每个字段信息。像

这样的东西

关键,价值,分享?

Firstname, John, true
Lastname, Smith, true
Gender, male, false
Brithday, 19.01.1985, true

组织这种模型结构的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

你的问题看起来像是:“我应该使用EAV吗?”

你应该在这里寻找关于这个主题的一个很好的论坛讨论: http://www.dbforums.com/database-concepts-design/1619660-otlt-eav-design-why-do-people-hate.html

大多数时候我认为答案是否定的(只是google“SQL antipatterns EAV”到这个主题的一堆资源)。为什么不使用包含所有字段的普通表?有这么多属性吗?如果字段不是常量,则还可以将数据存储在Blob列中(以避免EAV)。

答案 1 :(得分:0)

EAV结构的一些问题:

  • 您将失去使用SQL数据类型的能力(每个值必须为TEXT)。

  • 您将失去使用UNIQUE或FOREIGN KEY等SQL约束甚至NOT NULL的能力。

  • 您无法将一行数据作为一行进行查询,而无需编写与您拥有属性一样多次执行自连接的大型查询。

  • 在您使用它的每个时间存储“密钥”或属性名称​​非常浪费。

那够了吗?

阅读这篇关于几乎关闭的公司的文章,因为有人认为这是一种存储数据的“通用”方式:Bad CaRMa

我在StackOverflow和我的博客文章以及我的书EAV FAIL中已经讨论了很多SQL Antipatterns: Avoiding the Pitfalls of Database Programming

关系数据库的更好解决方案是为每个属性定义一列。

  • 您可以为列提供有意义的名称,并将其存储一次作为元数据,而不是存储在每一行。

  • 您可以使用适当的SQL数据类型来帮助实施正确的数据验证。

  • 您还可以使用SQL约束来帮助数据完整性。否则你必须在你的应用程序中编写大量代码来实现数据规则,我希望你有更好的事情要做。