1. ホーム
  2. database

[解決済み] データベースのカラムに区切りリストを格納することは、本当に悪いことなのか?

2022-03-24 20:42:52

質問

チェックボックスのセットを持つWebフォームを想像してください(それらのいずれか、またはすべてを選択することができます)。私はそれらをデータベーステーブルの1つのカラムに格納された値のカンマ区切りリストに保存することを選択しました。

さて、正しい解決策は、2つ目のテーブルを作り、データベースを適切に正規化することであることは分かっています。簡単な解決策を実装した方が早いし、そのアプリケーションの概念実証を早く、あまり時間をかけずにやりたかったのです。

私の場合、時間の節約とコードの簡素化は価値があると思ったのですが、これは擁護できる設計上の選択でしょうか、それとも最初から正規化するべきだったのでしょうか?

このアプリケーションは、基本的に共有フォルダに保存されていたExcelファイルを置き換える、小さな社内アプリケーションです。また、このプログラムを整理して、より保守しやすいものにしようと考えているので、質問させていただきました。その中に完全に満足していないものがいくつかあり、そのうちの1つがこの質問のトピックです。

どのように解決するのですか?

に違反することに加え 第一正規形 カンマ区切りリストは、1つのカラムに格納される値のグループが繰り返されるため、より実用的な問題が多くあります。

  • 各値が正しいデータ型であることを確認できない。 1,2,3,バナナ,5
  • 外部キー制約を使用して値をルックアップテーブルにリンクできない。参照整合性を強制する方法がない。 一意性を強制できない。 1,2,3,3,3,5
  • リスト全体をフェッチしないと、リストから値を削除できない。
  • 文字列カラムに収まるサイズより長いリストは保存できません。
  • リスト内の指定された値を持つすべてのエンティティを検索するのは困難で、非効率なテーブルスキャンを使用しなければならない。MySQL などの正規表現に頼らざるを得ない場合がある。
    idlist REGEXP '[[:<:]]2[[:>:]]' またはMySQL 8.0の場合。 idlist REGEXP '\\b2\\b'
  • リストの要素を数えたり、その他の集計クエリを実行するのが難しい。
  • 値が参照するルックアップテーブルに値を結合することが困難である。
  • リストをソートして取得することが困難です。
  • 値に現れないことが保証されているセパレータを選択するのは難しい

これらの問題を解決するためには、大量のアプリケーションコードを記述し、RDBMSの より効率的に提供されている .

カンマ区切りリストは、私の本の最初の章にしたほど間違っています。 SQLアンチパターン。データベースプログラミングの落とし穴を回避する .

非正規化を採用する必要がある場合もありますが、そのような場合は OMGポニーについて これは例外的なケースです。 非リレーショナルな「最適化」は、ある種のクエリに利益を与え、他のデータの利用を犠牲にします。したがって、どのクエリが非正規化に値するほど特別に扱われる必要があるのかを確認してください。