P粉9482589582023-08-28 11:49:53
“原因之一是懒惰”。
这敲响了警钟。您应该做这样的事情的唯一原因是您知道如何“以正确的方式”做这件事,但您得出的结论是有一个切实的理由不这样做。
话虽如此:如果您选择以这种方式存储的数据是您永远不需要查询的数据,那么可能存在以您选择的方式存储它的情况。
(有些用户会对我上一段的说法提出异议,说“你永远不知道将来会增加什么要求”。这些用户要么被误导,要么陈述宗教信仰。有时,努力工作是有利的您面前的要求。)
P粉5459565972023-08-28 09:02:45
除了违反第一范式之外,还因为存储在单个值中的重复组值列、逗号分隔列表还有很多其他更实际的问题:
idlist REGEXP '[[:<:]]2[[:>:]]'
或在 MySQL 8.0 中:idlist REGEXP '\\b2\\b'
李>
为了解决这些问题,您必须编写大量应用程序代码,重新发明 RDBMS 已经提供的更高效的功能。
逗号分隔的列表是错误的,我将其作为我书中的第一章:SQL 反模式,卷 1 :避免数据库编程的陷阱。
有时您需要采用非规范化,但正如 @OMG Ponies 提到的,这些都是例外情况。任何非关系“优化”都会使一种类型的查询受益,但会牺牲数据的其他用途,因此请确保您知道哪些查询需要特别处理,以便它们值得非规范化。