16

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 つの列に格納する方がよいでしょうか?

ありがとう。

4

9 に答える 9

33

これは開発者を混乱させます。

より良い開発者を獲得してください。それが正しいアプローチです。

于 2009-04-24T17:53:56.503 に答える
26

あなたの提案は、エレガントで強力なベスト プラクティス ソリューションです。

他の回答が次のことを十分に強く言っているとは思わないので、そうします。

開発者が 1) リレーショナル データベースで多対多の関係をモデル化する方法を理解できず、2) CategoryID を区切られた文字データとして保存することを強く主張する場合、

その後、すべてのデータベース設計権限を即座に失う必要があります。少なくとも、彼らはチームに参加する実際の経験豊富な専門家を必要としています。彼らは、彼らがこのような愚かなことをするのを止める権限を持ち、完全に欠けているデータベース設計トレーニングを彼らに与えることができます.

最後に、実際に有能な開発者および設計者である私たちにとって、これは軽視であるため、彼らが適切にスピードアップするまで、彼らを再び「データベース開発者」と呼ぶべきではありません。

この回答が非常に役立つことを願っています。

アップデート

私の質問の主なポイントは、開発者の混乱とそれについて何をすべきかということではありません。

ポイントは、区切られた値が適切なソリューションである場合を理解することです。

非常にまれなケースを除いて、区切られた値は間違った解決策です。個々の値がクエリ/挿入/削除/更新されると、目的の値を操作するためだけに他のすべての値を解析して変更する必要があるため、これは間違った決定であったことが証明されます。これを行うと、最初の(!!!) 通常形に違反します (このフレーズは、信じられないほど卑劣な罵倒のように聞こえるはずです)。XML を使用して同じことを行うのも間違っています。区切られた値または複数値の XML を列に格納することは、データベースによって照会されず、常に別のコンシューマ (おそらく Web サーバーまたはEDI 受信者)。

これで最初のコメントに戻ります。第 1 正規形に違反することが良い考えだと考える開発者は、私の経験では非常に経験の浅い開発者です。

テキスト プロパティ バッグを使用した非常に洗練された非リレーショナル データ ストレージの実装があることは認めます (Facebook(?) や、数千のサーバーで実行されているその他の数百万のユーザー サイトなど)。データベース、ユーザー ベース、および 1 秒あたりのトランザクション数が十分に大きくなれば、それを開発するための資金が得られます。それまでは、ベスト プラクティスに従ってください。

于 2009-04-24T18:09:19.383 に答える
17

カンマ区切りの ID を使用するのは、ほとんどの場合大きな間違いです。
RDBMS は関係を格納するように設計されています。

于 2009-04-24T17:55:39.087 に答える
16

私の解決策は、次のように連想テーブルを作成することです: これは開発者を混乱させます

本当に?これはデータベース 101 です。これが混乱を招く場合は、ウィザードで生成されたコードから離れて、基本的な DB の正規化を学ぶ必要があるかもしれません。

あなたが提案するものは正しい解決策です!!

于 2009-04-24T17:56:10.677 に答える
11

設計の Document_Category テーブルは、問題にアプローチするための正しい方法です。可能であれば、次善の解決策を考え出すのではなく、開発者を教育することをお勧めします (パフォーマンスが低下し、参照整合性が失われます)。

他のオプションは、使用しているデータベースによって異なる場合があります。たとえば、SQL Server では、定義済みのスキーマに配列を格納し、そのフィールドの内容に基づいて結合できる XML 列を使用できます。他のデータベースシステムにも同様のものがあるかもしれません。

于 2009-04-24T17:57:09.647 に答える
6

実行している多対多のマッピングは問題なく正規化されています。また、必要に応じて後で他のデータを追加することもできます。たとえば、カテゴリがドキュメントに追加された時刻を追加したいとします。

document_category テーブルにも代理主キーを設定することをお勧めします。そして、そうすることが理にかなっている場合は、Unique(documentid, categoryid) 制約。

なぜ開発者は混乱するのですか?

于 2009-04-24T17:55:39.510 に答える
6

「これは開発者の設計を混乱させる」ということは、開発者の教育が不十分であることを意味します。これはより優れたリレーショナル データベース設計です。可能な限り使用する必要があります。

本当にリスト構造を使用したい場合は、それらを理解する DBMS を使用してください。このようなデータベースの例として、U2 (Unidata、Universe) DBMS があります。これは、Pick DBMS に基づいています (または、昔はそうでした)。他にも同様の DBMS プロバイダーが存在する可能性があります。

于 2009-04-24T18:14:58.137 に答える
5

これは、古典的なオブジェクト リレーショナル マッピングの問題です。開発者はおそらく愚かではなく、単に経験が浅いか、物事を正しく行うことに慣れていないだけです。「3NF!」と叫ぶ。何度も何度も正しい方法を納得させることはできません。

開発者に、パイプ区切りのアプローチを使用してカテゴリごとにドキュメントの数を取得する方法を説明するよう依頼することをお勧めします。これは悪夢のようですが、リンク テーブルを使用すると非常に簡単になります。

于 2009-04-24T18:34:06.717 に答える
5

私の開発者がこの「データベース列のカンマ区切りの値」アプローチを試す最大の理由は、複数の値の必要性に対処するために新しいテーブルを追加すると、データ モデルとデータベース。

彼らのほとんどは、あらゆる種類の理由で回避策が悪いことを知っていますが、できるという理由だけでこの次善の方法を選択します。彼らはこれを行うことができ、おそらく捕まることはありません。または、プロジェクトのかなり後になって、修正するのに費用がかかりリスクが高すぎるときに捕まるでしょう。なぜ彼らはこれを行うのですか?彼らのパフォーマンスは、品質やコンプライアンスではなく、スピードのみで評価されるからです。

私のプロジェクトの 1 つと同様に、開発者は複数の値を入れるテーブルを持っていたが、そのデータを親テーブルに複製するとパフォーマンスが向上するという印象を受けていた可能性もあります。彼らは間違っていて、それについて非難されました。

したがって、これらのコストがかかり、リスクが高く、ビジネスの信頼を損なうこれらのトリックを処理する方法に対する答えが必要ですが、短期的にも長期的にも、この一連のアクションを採用する方が良いと開発者が信じている理由を見つけるよう努める必要があります。プロジェクトと会社のために。次に、認識とデータ構造の両方を修正します。

はい、それは単に怠惰、悪意、または無知である可能性がありますが、ほとんどの場合、開発者がこのようなことを行うのは、「とにかくやりなさい」と常に言われているからだと思います。データ モデルとデータベースの設計側は、新しいエンティティ/テーブル/情報のビジネス要件を満たすための要求にどの程度対応できるかについて、間違ったメッセージを送信していないことを確認する必要があります。

また、データ担当者は、データ アーキテクチャの「構築済み」部分を常に監視する必要があることも確認する必要があります。

個人的には、リレーショナル データベースでカンマ区切りの値を使用することを許可することは決してありません。列内の複数の値を作成、更新、管理し、すべての値処理する解析ルーチンを構築するよりも、新しいテーブルを構築する方が実際には高速だからです。データにコンマが埋め込まれている場合があるため、異常が導入されました。

要するに、コンマ区切りの値を使用しないでください。ただし、開発者がそれを実行したい理由を見つけて、その問題を修正してください。

于 2009-05-09T19:52:20.433 に答える