最近、いくつかのレガシーシステムに取り組み始めました。それを開発した人々は、データベーステーブルの単一のフィールドに文字列のリストを格納するというアイデアを思いつきました。これは、データベースに表現もデータもないオブジェクトの識別子であるとしましょう。その識別子の範囲は、本番環境では比較的小さくなります。
一方、私の直感と「良いデザインの好み」は、別のテーブルで表現する必要があることを示しています(多対多の関係を表すために使用されるテーブルと同様)。
彼らのアプローチは本当に悪いのですか?リファクタリングを開始する方が良いでしょうか?はいの場合、元の設計が将来どのような悪影響をもたらす可能性がありますか?そのアプローチを説明するリレーショナルデザインの原則はありますか?
コメントへの応答を編集:
おそらく、彼らはこのアプローチを使用して、階層構造化などの特定の問題を巧妙な方法で解決していません。最もありそうなシナリオは、彼らが時間のプレッシャーの下で単に働いていて、新しい機能をできるだけ早く実装する必要がある場合でした。
以前はフィールドが単一の値を表していたと思います。彼らは複数の値を保存する機能を実装する予定で、データベースの移行を回避しようとしました。
データモデルは正規化されていません。そうするためには、別のテーブルが必要になります。その点で、それは特に優れたデータモデリング手法ではありません。
それが正当な理由で行われたかどうかを判断することは困難です。おそらく、コーディングの簡素化またはパフォーマンスが動機であった可能性があります。おそらく、フィールドには元々1つの識別子が含まれていたため、要件が変更され、開発者はリファクタリングする時間や傾向がありませんでした。
おそらくもっと重要なのは、自分でリファクタリングするべきかどうかです。同様の状況では、デフォルトでこのようなケースを事前にリファクタリングしません。次のいずれかが当てはまる場合、私はそれを検討します。
私がやろうとしていること、およびTBHレガシーアプリケーションを引き継ぐときはいつでもこれをお勧めします。これはwiki(または同等のもの)を開始し、このようなケースを文書化することです。たとえば、
これは、コードベースで作業したり、コードベースに戻ったりするときに役立つ助手メモであることがわかりました。また、後継者がコードベースの学習を開始する必要があるときに、後継者にとって非常に役立ちます。
文字列のリストを単一のデータベースフィールドに格納することは悪い考えですか?
これは通常、正規化違反と見なされます。
ただし、これは問題の解決策として使用されることがあります。階層構造では、ある種の可変長パス文字列が構造を表します。
単一の文字列内のアイテムのリストに関する問題には、次のものがあります。
これを行うのが一般的なアンチパターンです。
要件が変化し、かつては1つしか必要でなかった場所に、より多くの値が必要になりました。本のように、著者は1人だけですよね?本に複数の著者がいると誰が推測したでしょうか?これは、データベーススキーマを変更せずに、この要件の変更を満たす簡単な方法です。
しかし、いくつかの欠点もあります。
したがって、基本的には、これを行わないでください。
私たちが悪い考えであるという議論はすでにたくさんあります。それが良い、または少なくともOKなアイデアである理由をいくつか追加するのは公平だと思います。これらのうちいくつが特定のケースに当てはまるかはわかりませんが、少なくとも実行されたパフォーマンスの注釈が関連しているようです。
リファクタリングを試みるときは、常に以前の設計選択の背後にある理由を最初に理解することを常にお勧めします。条件と要件が実際に十分に変更されて、コストとリスクを正当化できることを確認してください。