我有一个个人资料页面,上面有大约20个可选字段。为了保持规范化,我必须创建20个不同的表,然后在其中进行20 JOINS
的查询。这对我来说似乎有点过头了。
这是最好的方法吗?
你建议我保持标准化吗?
答案 0 :(得分:2)
这样做的好方法(虽然有点令人困惑,除非你知道发生了什么)使用相同的设计wordpress使用 - 据我记得它被称为实体属性值(感谢@Matt Fenwick)。 https://stackoverflow.com/tags/eav/info
基本的想法是,您有两个表,而不是您的20个INNER JOIN
能够存储赔率和结果的表。一个存储您的实体(一个帖子在wordpress'案例中),第二个存储您的所有可能性和结束 - 或者WP指向它的元数据。
您没有为每个数据点添加一列,而是有一列名称,一列用于值,另一列用于此属性适用的实体的ID。
通过这种方式,您可以节省大量SQL,在扩展期间会遇到麻烦,并且需要时间来构建它。如果您需要为另一个房产提供服务,那么您只需将其与其他房产一起打包 - 不要破坏架构。
关于WP数据库布局的更多细节(这里我主要考虑的是wp_posts和wp_postmeta表):http://codex.wordpress.org/Database_Description
所以一个例子可能是(伪代码,对不起):
table: yourEntity
entityID int, primary key, auto increment
title varchar
table: yourEntityMeta
entityID int, non-unique key
name text
value text
通过这种方式,您可以为每个实体提供任意数量的属性,对具有NULL
值的未使用列和18个需要加入的表没有限制或性能问题。
希望这有帮助
注意:此问题的一个问题(注释中的@ypercube指出)是使用这意味着您不能为每个属性指定数据类型,即日期属性将存储为文本,布尔值也是如此或者int。您也无法使用foriegn键链接到有效值表(感谢@Catcall)。在沿着这条路走下去之前,你需要仔细考虑。
答案 1 :(得分:1)
我只会将可空列用于可选字段。该表将变得非常大,但是如此多的连接只会降低您的性能,如果这些字段属于一个对象并且将一起更新,我找不到这些字段应该规范化的原因。
答案 2 :(得分:0)
如果选项字段是常量,请考虑使用ENUM(2-20个选项),但是这种方法有其自身的缺陷。
如果您主要关心的是数据库规范化,那么即使您有20个选项字段,也应该为每个选项字段设置单独的“查找”表,以便您不存储重复数据。
此外,如果您决定在将来更改选项,那么将来您的表格将更容易维护。
JOIN语句并没有那么糟糕,MySQL可以在一个查询中支持多达61个表。我已在this question of mine中探讨过该主题。