2009.04.24 更新
私の質問の主なポイントは、開発者の混乱とそれについて何をすべきかということではありません。
ポイントは、区切られた値が適切なソリューションである場合を理解することです。
商用製品データベースで使用される区切りデータを見てきました (Ektron 笑)。
SQL Server には XML データ型もあるため、区切りフィールドと同じ目的で使用できます。
/終了更新
私が設計しているアプリケーションには、多対多の関係があります。以前は、データベースでこれらを表すために連想テーブルをよく使用していました。これは、開発者にいくらかの混乱を引き起こしました。
DB 構造の例を次に示します。
Document
---------------
ID (PK)
Title
CategoryIDs (varchar(4000))
Category
------------
ID (PK)
Title
Document と Category の間には多対多の関係があります。
この実装では、Document.CategoryIDs はパイプで区切られた CategoryID の大きなリストです。
私にとっては、クエリで部分文字列の一致を使用する必要があるため、これは悪いことです。これはインデックスを使用できません。これは遅く、スケーリングしないと思います。
そのモデルで、カテゴリのすべてのドキュメントを取得するには、次のようなものが必要になります。
select * from documents where categoryids like '%|' + @targetCategoryId + '|%'
私の解決策は、次のように連想テーブルを作成することです。
Document_Category
-------------------------------
DocumentID (PK)
CategoryID (PK)
これは開発者を混乱させます。私が見逃しているエレガントな代替ソリューションはありますか?
Document には何千行もあると思います。カテゴリは 40 行程度です。主な関心事はクエリのパフォーマンスです。私はこれを過剰に設計していますか?
データを連想テーブルにプッシュするよりも、ID のリストをデータベース列に格納する方が好ましい場合はありますか?
また、ドキュメント間に多対多の関係を作成する必要がある場合があることも考慮してください。これは、関連テーブル Document_Document を示唆しています。それが望ましい設計ですか、それとも関連するドキュメント ID を 1 つの列に格納する方がよいでしょうか?
ありがとう。