Stellen Sie sich ein Webformular mit einer Reihe von Kontrollkästchen vor (von denen einige oder alle ausgewählt werden können). Ich habe mich dafür entschieden, sie in einer durch Kommas getrennten Liste von Werten zu speichern, die in einer Spalte in der Datenbanktabelle gespeichert sind.
Jetzt weiß ich, dass die richtige Lösung darin besteht, eine zweite Tabelle zu erstellen und die Datenbank korrekt zu normalisieren. Eine einfache Lösung lässt sich schneller implementieren und ich möchte schnell einen Proof of Concept der Anwendung erhalten, ohne zu viel Zeit dafür aufwenden zu müssen.
Ich denke, die Zeitersparnis und der einfachere Code lohnen sich in meinem Fall. Ist das eine vernünftige Designwahl oder sollte ich das einfach von Anfang an standardisieren?
Für mehr Kontext: Dies ist eine kleine interne Anwendung, die im Wesentlichen eine Excel-Datei ersetzt, die in einem freigegebenen Ordner gespeichert ist. Ich stelle diese Frage auch, weil ich darüber nachdenke, das Programm zu bereinigen und die Wartung zu vereinfachen. Es gibt einige Dinge, mit denen ich nicht besonders zufrieden bin. Eines davon ist Gegenstand dieser Frage.
“原因之一是懒惰”。
这敲响了警钟。您应该做这样的事情的唯一原因是您知道如何“以正确的方式”做这件事,但您得出的结论是有一个切实的理由不这样做。
话虽如此:如果您选择以这种方式存储的数据是您永远不需要查询的数据,那么可能存在以您选择的方式存储它的情况。
(有些用户会对我上一段的说法提出异议,说“你永远不知道将来会增加什么要求”。这些用户要么被误导,要么陈述宗教信仰。有时,努力工作是有利的您面前的要求。)
除了违反第一范式之外,还因为存储在单个值中的重复组值列、逗号分隔列表还有很多其他更实际的问题:
idlist REGEXP '[[:<:>:]]'
或在 MySQL 8.0 中:idlist REGEXP '\\b2\\b'
李>为了解决这些问题,您必须编写大量应用程序代码,重新发明 RDBMS 已经提供的更高效的功能。
逗号分隔的列表是错误的,我将其作为我书中的第一章:SQL 反模式,卷 1 :避免数据库编程的陷阱。
有时您需要采用非规范化,但正如@OMG Ponies 提到的,这些都是例外情况。任何非关系“优化”都会使一种类型的查询受益,但会牺牲数据的其他用途,因此请确保您知道哪些查询需要特别处理,以便它们值得非规范化。