suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Ist das Speichern getrennter Listen in Datenbankspalten wirklich so schlimm?

<p>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. </p> <p>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. </p> <p>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? </p> <p>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. </p>
P粉020556231P粉020556231475 Tage vor487

Antworte allen(2)Ich werde antworten

  • P粉948258958

    P粉9482589582023-08-28 11:49:53

    “原因之一是懒惰”。

    这敲响了警钟。您应该做这样的事情的唯一原因是您知道如何“以正确的方式”做这件事,但您得出的结论是有一个切实的理由不这样做。

    话虽如此:如果您选择以这种方式存储的数据是您永远不需要查询的数据,那么可能存在以您选择的方式存储它的情况。

    (有些用户会对我上一段的说法提出异议,说“你永远不知道将来会增加什么要求”。这些用户要么被误导,要么陈述宗教信仰。有时,努力工作是有利的您面前的要求。)

    Antwort
    0
  • P粉545956597

    P粉5459565972023-08-28 09:02:45

    除了违反第一范式之外,还因为存储在单个值中的重复组值列、逗号分隔列表还有很多其他更实际的问题:

    • 无法确保每个值都是正确的数据类型:无法防止 1,2,3,banana,5
    • 不能使用外键约束将值链接到查找表;无法强制执行引用完整性。
    • 无法强制唯一性:无法阻止1,2,3,3,3,5
    • 如果不获取整个列表,则无法从列表中删除值。
    • 存储的列表长度不能超过字符串列的长度。
    • 很难搜索列表中具有给定值的所有实体;你必须使用低效的表扫描。可能不得不求助于正则表达式,例如在 MySQL 中:
      idlist REGEXP '[[:<:]]2[[:>:]]' 或在 MySQL 8.0 中:idlist REGEXP '\\b2\\b'
    • 很难对列表中的元素进行计数,或进行其他聚合查询。
    • 很难将值连接到它们引用的查找表。
    • 很难按排序顺序获取列表。
    • 很难选择一个保证不会出现在值中的分隔符

    为了解决这些问题,您必须编写大量应用程序代码,重新发明 RDBMS 已经提供的更高效的功能。

    逗号分隔的列表是错误的,我将其作为我书中的第一章:SQL 反模式,卷 1 :避免数据库编程的陷阱

    有时您需要采用非规范化,但正如 @OMG Ponies 提到的,这些都是例外情况。任何非关系“优化”都会使一种类型的查询受益,但会牺牲数据的其他用途,因此请确保您知道哪些查询需要特别处理,以便它们值得非规范化。

    Antwort
    0
  • StornierenAntwort