当前位置: 首页 > 面试题库 >

两个表结构之间的区别

闻人仲渊
2023-03-14
问题内容

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

表格1

id,         name,       age,        birthdate,      address
somedata1   somedata1   somedata1   somedata1       somedata1
somedata2   somedata2   somedata2   somedata2       somedata2
somedata3   somedata3   somedata3   somedata3       somedata3

表2

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

问题答案:

通常,第二个表在数据库设计的上下文中是 反模式的 。而且,它还有特定的名称: 实体属性值
(EAV)。在某些情况下,使用这种设计是有道理的,但是这种情况很少见,甚至可以避免。

为什么EAV不好

数据完整性支持

尽管事实是这样的结构似乎更加“灵活”或“先进”,但这种设计仍存在缺陷。

  • 不可能设置强制属性 。您不能使某些属性为强制性的,因为属性现在存储为一行-并且未设置该属性的唯一标志-表中没有相应的行。SQL不允许您本机构建这样的约束-因此,您必须在应用程序中进行检查-是的, 每次都查询表
  • 混合数据类型 。您将无法使用SQL标准数据类型。因为您的value列必须是其中所有存储值的“超类型”。这意味着-通常,您必须将所有数据存储为 原始字符串 。然后,您将看到像字符串一样处理日期,每次转换数据类型,检查数据完整性等等都是多么痛苦的事情。
  • 不能强制执行参照完整性 。在正常情况下,您可以使用外键通过在父表中定义的值来限制您的值。但这不是这种情况-这是因为引用完整性应用于表中的每一行,而不应用于行值。所以-您将失去这一优势-这是关系数据库中 的基础 之一
  • 无法设置属性名称 。这意味着-您不能在数据库级别适当限制属性名称。例如,您将"customer_name"在第一种情况下将其写为属性名称-另一个开发人员会忘记使用它"name_of_customer"。并且..没关系,DB会通过它,并且您将花费数小时来调试这种情况。

行重建

此外,在常见情况下,行重构将很糟糕。例如,如果您有5个属性-这将是5个自我表JOIN-s。对于如此简单的情况-乍一看-
情况来说太糟糕了。因此,我什至都不想想象您将如何维护20个属性。

可以辩解吗?

我的意思是-不。在RDBMS中,总会有避免这种情况的方法。这太糟糕了。而且,如果打算使用EAV,则最佳选择可能 是非关系 数据库。



 类似资料:
  • 问题内容: 我已经看到在Python中实际上有两种(也许更多)串联列表的方法:一种方法是使用extend()方法: 另一个使用plus(+)运算符: 现在,我想知道:这两个选项中的哪一个是列表连接的“ pythonic”方式,并且两者之间有区别(我查看了Python的官方教程,但找不到有关此主题的任何信息)。 问题答案: 在字节码级别上的唯一区别是,该方式涉及函数调用,在Python中该函数比。调

  • 本文向大家介绍数组和结构之间的区别,包括了数组和结构之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解数组和结构之间的区别。 数组 它指的是由相同/相同数据类型的元素组成的集合。 它使用下标/'[]'(方括号)来访问元素。 它是指向集合的第一个元素的指针。 数组对象无法实例化。 数组的大小基于数组中元素的数量是固定的。 此大小是元素数量与每个元素的大小的乘积。 数组中不能使用

  • 问题内容: 抱歉,我的问题是否愚蠢,没关系。但是我只想知道在这两种情况下会发生什么。 两者都只给出相同的结果。但是我知道有一些原因。我不知道这一点。这两个条件有什么区别? 问题答案: 它们之间没有任何区别。许多程序员使用第二种方法只是为了确保他们没有得到。就这样。

  • 问题内容: 具有两个不同的.tar.gz文件:第二个.tar.gz是第一个.tar.gz的子集。 我需要单行命令才能在第二个.tar.gz中找到丢失的文件。 例如: 1.tar.gz文件列表: 2.tar.gz文件列表: 输出应为: 问题答案: 只需列出内容并执行:

  • 本文向大家介绍C#中的类和结构之间的区别,包括了C#中的类和结构之间的区别的使用技巧和注意事项,需要的朋友参考一下 为了区分类和结构,我们首先必须了解,在保存和定义数据的上下文中,结构和类似乎是等效的。这两个都可以定义并在其数据成员中保留一些默认值。但是,如果我们在此上下文之外考虑它们,则与结构相比,类将提供更多的灵活性以及功能。 以下是类和结构之间的重要区别。 序号 键 类 结构体 1 数据类型

  • 问题内容: 被分组的一头雾水。它有什么不同? 问题答案: 这里有两件事需要解释:量化组的行为和方法的设计。 在您的第一个示例中,匹配在组#1中捕获的。然后,它匹配并捕获到#1组中,从而覆盖。然后再次使用,这就是比赛结束时第一组的比赛。 但是它 确实 匹配整个字符串。如果您正在使用或者,你就可以看MatchObject,看到包含与包含。但是返回字符串,而不是MatchObjects。如果没有组,则返