はい、それはひどい考えです。
行く代わりに:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
あなたは今行く必要があります:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
次に、アプリケーションコードで何かを行って、そのコンマリストを個々の番号に分割し、データベースを個別にクエリする必要があります。
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
このデザインのアンチパターンは、リレーショナルモデリングの完全な誤解(テーブルを怖がる必要はありません。テーブルは友達です。それらを使用してください)、またはカンマ区切りのリストを取得して分割する方が速いという奇妙に誤った信念に由来しますアプリケーションコードでは、リンクテーブルを追加することはありません(追加することはありません)。3番目のオプションは、外部キーをセットアップできるほどSQLに自信/能力がないことですが、その場合は、リレーショナルモデルの設計とは何の関係もありません。
SQL Antipatterns(Karwin、2010)は、このアンチパターン(彼は「Jaywalking」と呼んでいます)、15〜23ページに章全体を当てています。また、著者はSOで同様の質問を投稿しています。彼が(この例に適用されるように)指摘するキーポイントは次のとおりです。
- 特定のカテゴリのすべての取引のクエリはかなり複雑です(その問題を解決する最も簡単な方法は正規表現ですが、正規表現はそれ自体が問題です)。
- 外部キーの関係なしに参照整合性を強制することはできません。DealCategory nrを削除した場合。#26、アプリケーションコードで、カテゴリ#26への参照を探して各取引を調べ、それらを削除する必要があります。これはデータ層で処理されるべきものであり、アプリケーションで処理する必要があることは非常に悪いことです。
- 集計クエリ(
COUNT
、SUM
など)も、「複雑」から「ほぼ不可能」までさまざまです。すべてのカテゴリのリストとそのカテゴリの取引数のカウントを取得する方法を開発者に確認してください。適切に設計されていれば、それは4行のSQLです。
- 更新はさらに難しくなります(つまり、5つのカテゴリに属する取引がありますが、2つを削除して他の3つを追加したい場合)。これは、適切な設計の3行のSQLです。
- 最終的には、
VARCHAR
リストの長さの制限に直面します。4000文字を超えるコンマ区切りのリストがある場合でも、とにかくモンスターが遅くなると解析する可能性があります。
- データベースからリストを引き出し、それを分割し、別のクエリのためにデータベースに戻ることは、本質的に1つのクエリよりも遅くなります。
TLDR:それは根本的に欠陥のある設計であり、うまく拡張できず、最も単純なクエリでさえ複雑さを増し、すぐにアプリケーションを遅くします。