Mysql 两种表结构的区别

Mysql 两种表结构的区别,mysql,sql,database,database-design,Mysql,Sql,Database,Database Design,我对这两种结构感到非常困惑。这两张桌子的优点和缺点是什么? 哪一个更好,为什么 表1 表2 在第二种情况下(表2),这很复杂,在查询数据时需要花费大量时间来查找数据。当您不知道列的数量或列的长度不同时,使用这种情况,如果列的长度固定,则使用第一种情况(表1),因为在这种情况下,数据查找速度很快。带有列的表id,name,age,birthdate,地址是您在部署前知道要存储的实体信息时使用的地址 如果您仅在部署后知道要存储关于实体的哪些信息(例如,非技术人员是否应该能够定义要捕获的字段),则可以

我对这两种结构感到非常困惑。这两张桌子的优点和缺点是什么? 哪一个更好,为什么

表1

表2


在第二种情况下(表2),这很复杂,在查询数据时需要花费大量时间来查找数据。当您不知道列的数量或列的长度不同时,使用这种情况,如果列的长度固定,则使用第一种情况(表1),因为在这种情况下,数据查找速度很快。

带有列的表
id
name
age
birthdate
地址
是您在部署前知道要存储的实体信息时使用的地址


如果您仅在部署后知道要存储关于实体的哪些信息(例如,非技术人员是否应该能够定义要捕获的字段),则可以使用列为
id
col\u name
col\u value
的表。它效率较低,但允许您在不更改数据库架构的情况下定义新字段。

反模式? 在通常情况下,第二个表在数据库设计上下文中是反模式的。而且,它还有一个特定的名称:实体属性值(Entity Attribute Value,EAV)。有些情况下,使用这种设计是合理的,但这是罕见的情况-即使在那里它也可以避免


为什么EAV是坏的 数据完整性支持

尽管事实上,这种结构似乎更“灵活”或“先进”,但这种设计存在弱点

  • 无法设置强制属性。您不能强制某些属性,因为该属性现在存储为一行—并且该属性未设置的唯一标志—是表中缺少相应的行。SQL不允许您以本机方式构建此类约束—因此,您必须在应用程序中检查该约束—并且,是的,每次都要查询您的表
  • 数据类型的混合。您将无法使用SQL标准数据类型。因为您的值列必须是其中所有存储值的“超级类型”。这意味着-您通常必须将所有数据存储为原始字符串。然后,您将看到像处理字符串一样处理日期、每次转换数据类型、检查数据完整性、e t.c是多么痛苦
  • 不可能强制执行引用强制性。在正常情况下,可以使用外键来限制父表中定义的值。但在本例中并非如此——这是因为引用完整性应用于表中的每一行,而不是行值。所以-你会失去这个优势-这是关系DB的基本要素之一
  • 无法设置属性名称。这意味着-不能在DB级别上正确限制属性名称。例如,在第一种情况下,您将编写
    “customer\u name”
    作为属性名,而另一个开发人员将忘记这一点,并使用
    “name\u of\u customer”
    。和。。没关系,DB会通过这个测试,最后你会花几个小时调试这个案例
行重建

此外,行重建在常见情况下会非常糟糕。例如,如果您有5个属性-即5个self table
JOIN
-s。乍一看,对于这样简单的案例来说太糟糕了。所以我甚至不想想象你将如何维护20个属性


这是否合理?
我的观点是-不。在RDBMS中,总会有办法避免这种情况。太可怕了。如果打算使用EAV,那么最好的选择可能是非关系数据库。

这取决于您的目标。第一种更适合于数据类型约束,因为您可以定义/限制插入的值(即确保它是有效日期)。如果以后添加更多的“属性”,则第二种方法会更灵活,因为不需要修改表结构。每种方法都有更多的优点/缺点,因此您确实需要了解在存储和查询数据方面要做些什么。仅当您始终更改属性时才使用第二个。
id,         name,       age,        birthdate,      address
somedata1   somedata1   somedata1   somedata1       somedata1
somedata2   somedata2   somedata2   somedata2       somedata2
somedata3   somedata3   somedata3   somedata3       somedata3  
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