Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 为什么要在SQL文本列中存储带分隔符的列表?_Database Design - Fatal编程技术网

Database design 为什么要在SQL文本列中存储带分隔符的列表?

Database design 为什么要在SQL文本列中存储带分隔符的列表?,database-design,Database Design,我必须维护一个应用程序,该应用程序有许多文本数据类型的列,其中插入了多个值,这些值用逗号、斜杠甚至是管道(|)字符分隔。我想知道你到底为什么要这么做 例如,orders表有一个名为details的列,其中包含以下信息: 2x #ABC-12345 Widget, Black: $24.99 /4x #ABC-12344 Widget, Blue: $23.50 其中,/分隔行项目;有一个VBScript代码,它从记录集中读取值,并在For循环中解析出来,以便使用类似的方式显示(这几乎就是代码

我必须维护一个应用程序,该应用程序有许多文本数据类型的列,其中插入了多个值,这些值用逗号、斜杠甚至是管道(|)字符分隔。我想知道你到底为什么要这么做

例如,orders表有一个名为details的列,其中包含以下信息:

2x #ABC-12345  Widget, Black: $24.99 /4x #ABC-12344 Widget, Blue: $23.50
其中,
/
分隔行项目;有一个VBScript代码,它从记录集中读取值,并在
For
循环中解析出来,以便使用类似的方式显示(这几乎就是代码读取、变量名和所有内容的方式)
arydtls=split(rstmp(“details”),“/”
。对于各种表,此方法在整个代码中重复

在我看来,将细节放在一个单独的表中并链接回它会更好(更不用说更容易处理)(有趣的是,对于订单,it会这样做,但数据并不总是与详细信息文本字段匹配,因为OrderDetail表是在代码中更新的;详细信息字段在应用程序中被视为只读)


我的前任知道我不知道的事情吗,还是我说“WTF?!”是对的当我看到这个模式时,它看起来效率非常低,而且很难像这样维护,这使得运行报告变得格外困难,因为我需要的数据可能包含在文本字段中,或者可能包含在十几个表中,这些表具有相似的信息,并且在应用程序的不同部分中使用最常见的情况是:

  • 你的前任不称职/不懂
  • 您的前任在使用规范化结构时遇到了一些性能问题,并发现这种方法是一种改进
由于在查询操作方面,规范化通常非常昂贵,因此我们有时可以通过消除昂贵的连接并在应用程序端对单个行进行操作来获得性能提升

对于数据库设计来说,没有绝对的规则说“在一行中存储分隔值更适合此场景”。这完全是针对您的特定数据集和使用模式进行测试,并在必要时进行改进

根据我的经验,这种模式比标准化有所改进并不常见……这是非常非典型的


编辑:第三种可能性是,每行有n个值是对原始模式的更改,并且您的前任没有添加新表,而是调整了列的大小。这与“不称职”选项没有必然的区别:),但有时db模式更改会涉及政治压力…

WTF真的。永远不要在数据库中存储这样的东西。

您的前任可能有其他想法,但这没有完成

我可以告诉你,这对性能非常不利


您将如何创建一个查询来返回购买蓝色小部件的用户?您必须扫描整个表,然后解析该信息,如果有另一个表,并且这是标准化的,那么这将是更好的性能方面

我在某个企业软件中看到了一个数据库,它在很多地方都有。无论是从维护角度还是从性能角度来看,这都非常糟糕。所引用的理由大致如下:

  • 它“更简单”,因为它不需要连接
  • 它更快,因为它不需要连接
  • 它不会用大量的表扰乱数据库
现在,第一点可能是正确的,但在您想要查询它之前,它只是“更简单”。现在你完蛋了。所以我要说,这被有效地驳斥了。第二点也是正确的,只要你不反对它。一旦你必须读取整个表,解析数据,然后在你的应用程序中过滤行,你就输了。最后一个总是正确的,但谁在乎数据库是否“杂乱无章”?这就是它的目的!体面的RDBMS将允许您以任何方式将表放入多个模式中,这有点像名称空间,有助于消除混乱。一个好的命名惯例也有帮助(但如果你使用匈牙利疣,那么就帮助你$Detity)


简言之,这是个坏主意。我希望您可以修复它,但最有可能的是您将不得不按照其原始条款处理它…

在诸如Universe之类的操作系统中,UniData数据存储在由以下内容分隔的文件中

Char(254)=分隔属性 Char(253)=分隔属性中的多个值 Char(252)=分隔子值 等等

令人震惊,不是吗:-)每当我与仍在使用Database的前同事交谈,他们问我使用什么数据库时,他们问的第一个问题是“它可以处理多个值吗?”

在RDBMS中,我们将有一个订单表和一个订单行表。订单行上的PK很可能类似于OrderNumber、LineNumber

在UniData等中,他们要做的是按顺序拥有一个名为“Lines”的属性,该属性将保存OrderLine文件的键列表,复合键通常用星号分隔

  • 1234*1
  • 1234*2
  • 1234*3
然后,当他们将订单从文件加载到内存中时,他们有一个从订单行文件加载订单行所需的键列表。请注意,这些是文件而不是表:-)

在我看来,有经验的人试图使用关系数据库,但根本不理解它,然后试图让它像UniData一样工作


解雇他们:-)

很简单,他要么有理由,要么没有理由,不问就不可能知道。如果你假设他不是一个完全的想法,并且有一些可能的原因,那么可能是一个o
2x #ABC-12345  Widget, Black: $24.99 /4x #ABC-12344 Widget, Blue: $23.50
StockItems
    Code char(10) primary key
    Desc varchar(50)
Transaction
    TxnId something primary key
    : : :
TransactionPart
    TxnId something \
    TxnSeq int      / primary key
    Quantity integer
    Code char(10) foreign key StockItems(Code)
    Price float