我对这两种结构非常困惑。这两张表有什么优缺点? 哪一个更好,为什么?
的 TABLE1 的
id, name, age, birthdate, address
somedata1 somedata1 somedata1 somedata1 somedata1
somedata2 somedata2 somedata2 somedata2 somedata2
somedata3 somedata3 somedata3 somedata3 somedata3
的 TABLE2 的
id, col_name, col_value
somedata name somedata
somedata age somedata
somedata birthdate somedata
somedata address somedata
somedata2 name somedata2
somedata2 age somedata2
somedata2 birthdate somedata2
somedata2 address somedata2
somedata3 name somedata3
somedata3 age somedata3
somedata3 birthdate somedata3
somedata3 address somedata3
答案 0 :(得分:18)
通常情况下,第二个表在数据库设计的上下文中是反模式。而且,更具体的是,它具有特定的名称:实体 - 属性 - 值(EAV)。在某些情况下,使用这种设计是合理的,但这种情况很少见 - 甚至可以避免。
数据完整性支持
尽管事实上,这种结构似乎更“灵活”或“先进”,但这种设计存在缺陷。
"customer_name"
作为属性名称编写 - 而另一位开发人员会忘记并使用"name_of_customer"
。并且......没关系,DB会通过它,你将花费数小时调试这个案例。行重建
另外,在一般情况下,行重建会很糟糕。例如,如果您有5个属性 - 那将是5个自表JOIN
- s。这种简单 - 乍一看 - 太糟糕了。所以我甚至不想想你将如何保持20个属性。
我的观点是 - 不。在RDBMS中总会有一种方法可以避免这种情况。这太糟糕了。如果打算使用EAV,那么最佳选择可能是非关系数据库。
答案 1 :(得分:2)
在第二种情况下(table2)这很复杂,在我们查询数据时需要花费很多时间来查找数据。如果您不知道列数或它们是不同的,则使用这种情况,如果您有固定长度的列然后使用第一种情况(table1),因为在这种情况下数据可以快速找到。
答案 2 :(得分:1)
包含id
,name
,age
,birthdate
,address
列的表格是您在部署之前所知道的,要存储的信息关于一个实体。
如果您在部署后只知道要存储的有关实体的信息,则可以使用包含id
,col_name
,col_value
列的表格(例如,如果非技术人员应该能够定义他们希望捕获的字段)。效率较低,但允许您在不更改数据库架构的情况下定义新字段。