[解決済み] データベースのカラムに区切りリストを格納することは、本当に悪いことなのか?
質問
チェックボックスのセットを持つ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ポニーについて これは例外的なケースです。 非リレーショナルな「最適化」は、ある種のクエリに利益を与え、他のデータの利用を犠牲にします。したがって、どのクエリが非正規化に値するほど特別に扱われる必要があるのかを確認してください。
関連
-
ORA-06550 "の解決策。1 行目、7 列目"
-
PostgreSQLの配列
-
SQLSERVER エラーのリターンコードの意味一覧表
-
致命的なエラーです。D:Fatalエラー:メンバ関数prepare()の非オブジェクトに対する呼び出し in D:\...
-
PostgreSQLのエラー[ERROR: relation "xxxx" does not exist]を解決する。
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] MySQLでibdata1ファイルを縮小/パージする方法
-
[解決済み】非常に大きなテーブルの正確な行数をカウントする最速の方法?
-
[解決済み】多言語データベースのためのスキーマ
-
[解決済み] データベーステーブルのカラムにリストを格納する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
親行が削除または更新できない: 外部キー制約に失敗 解決策
-
解決方法 テーブルの定義が正しくありません。自動列は1つだけで、キーとして定義する必要があります。
-
MongoDBコマンド
-
MySql への JDBC 接続エラー com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException.MySQLSyntaxErrorException: 不明なデータベース 'test'
-
sql common mistake of incorrect predicate orderConversion failed when converting varchar value 'abc' to data type int
-
[解決済み] 全レコードを返すElasticsearchクエリ
-
[解決済み] postgresql のセッション/接続を切断する
-
[解決済み] redis-serverを停止するにはどうすればよいですか?
-
Oracle インポートエラー: データファイルのフィールドが最大長を超えています。
-
[解決済み】シャーディングとは何ですか、なぜそれが重要なのですか?