database-design – 这个数据库结构有名称吗?
我们处理来自客户端的例程数据馈送,该客户端刚刚从一个看似熟悉的表单(每个实体一行,每个属性一列)重构数据库到我认为不熟悉的表单(每个属性每个实体一行):
之前:每个属性一列 ID Ht_cm wt_kg Age_yr ... 1 190 82 43 ... 2 170 60 22 ... 3 205 90 51 ... 之后:所有属性都有一列 ID Metric Value 1 Ht_cm 190 1 Wt_kg 82 1 Age_yr 43 1 ... 2 Ht_cm 170 2 Wt_kg 60 2 Age_yr 22 2 ... 3 Ht_cm 205 3 Wt_kg 90 3 Age_yr 51 3 ... 这个数据库结构有名称吗?有什么相对优势?旧方法似乎更容易将有效性约束置于特定属性(非空,非负等)并且更容易计算平均值.但是我可以看到在不重构数据库的情况下添加新属性会更容易.这是构建数据的标准/首选方式吗? 解决方法它被称为实体 – 属性 – 值(有时也称为“名称 – 值对”),当人们在关系数据库中使用EAV模式时,它是“方孔中的圆钉”的经典案例.以下是您不应使用EAV的原因列表: >您不能使用数据类型.如果值是日期,数字或金钱(十进制),则无关紧要.它总是会被强制转换为varchar.这可能是从轻微的表现问题到巨大的痛苦(在月度汇总报告中追逐1美分的差异?). 相比: SELECT cID.ID AS [ID],cH.Value AS [Height],cW.Value AS [Weight],cA.Value AS [Age] FROM (SELECT DISTINCT ID FROM Client) cID LEFT OUTER JOIN Client cW ON cID.ID = cW.ID AND cW.Metric = "Wt_kg" LEFT OUTER JOIN Client cH ON cID.ID = cH.ID AND cW.Metric = "Ht_cm" LEFT OUTER JOIN Client cA ON cID.ID = cA.ID AND cW.Metric = "Age_yr" 至: SELECT c.ID,c.Ht_cm,c.Wt_kg,c.Age_yr FROM Client c 这是一个(非常简短的)列表,您应该何时使用EAV: >如果没有办法解决问题,您必须在数据库中支持无模式数据. 我知道我只是花了整整一篇文章详细说明为什么在大多数情况下EAV是一个可怕的想法 – 但有一些情况需要/不可避免.然而,在大多数情况下(包括上面的例子),它将比它的价值更麻烦.如果您需要广泛支持EAV类型的数据输入,您应该考虑将它们存储在键值系统中,例如: Hadoop / HBase,CouchDB,MongoDB,Cassandra,BerkeleyDB. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |