10

次のデータベースを想像してください。

テーブル「会社」には、フィールド id、name、および flagship_product_id があります。テーブル 'products' にはフィールド id、name、および company_id があります。

1 つの会社には主力製品 (1:1 の関係) が必要であり、すべての製品には 1 つの会社 (1:N の関係) が必要です。

MyISM などのストレージ エンジンを使用する場合、上記のシナリオで問題はないはずですが、InnoDB などのエンジンを使用する場合、新しいデータを INSERT するときに問題が発生します。

最初の INSERT で NULL の関係を許可する以外に良い解決策は何ですか?

要約すると、企業は主力製品を1 つ持つ必要があります。

4

7 に答える 7

5

flagship_product で NULL を許可するか、この状況をモデル化する方法を再考する必要があります。代わりに、製品のブール値フィールドとして flagship_product を配置することを検討してください。次に、循環依存関係はありません。または、FLAGSHIP、NORMAL、OBSOLETE などの値を持つ製品の product_type フィールドを設定します。もちろん、それを強制する必要がありますが、過去に、この種の問題に対するよりクリーンな解決策を見つけました。

于 2009-09-07T01:59:27.237 に答える
3

次のデータ モデルを使用することをお勧めします。

会社

  • COMPANY_ID pk

製品

  • PRODUCT_ID (パック)
  • COMPANY_ID (fk)

FLAGSHIP_PRODUCTS

  • COMPANY_ID (pk、fk)
  • PRODUCT_ID (fk)

テーブルに FLAGSHIP 列を作成してPRODUCTSも、特定の会社の主力製品が 1 つだけになるとは限りません。その理由は次のとおりです。

  • FLAGSHIP 列の一意のキーでは、値が互いに異なる必要があります
  • チェック制約は許容値のリストにすぎません
于 2009-09-07T02:07:06.820 に答える
2

その特定のデータベース エンジンはわかりませんが、アトミックな挿入および更新操作中にデータの整合性チェックまたは参照整合性を一時的に中断する方法を探してください。

于 2009-09-07T01:55:58.587 に答える
2

フラグシップ製品フィールドを製品テーブルにブール値として入れてみませんか...それとcompanyidにインデックスを付けて、かなり迅速な検索を行うことができます

于 2009-09-07T01:58:45.723 に答える
1

このような状況に正しく対処できるスマートで強力な製品は、複数割り当ての概念を完全に取り入れて実装するシステムだけです。

そのリーグでプレーする SQL システムは 1 つもありません。

編集

SQL システムには遅延制約チェックがありますが、それを使用すると面倒になる可能性があります。

于 2009-09-08T16:48:11.623 に答える
0

トランザクションが終了するまで参照整合性制約の 1 つを延期することで、サイクルを断ち切る必要があります。

「INITIALLY DEFERRED DEFERRABLE」でググってください。

(InnoDB がこれをサポートしているかどうかは不明)

于 2011-05-23T04:26:58.367 に答える
0

考えられる回避策の概要を次に示します。これがクラッジスケールのどの程度に当てはまるかはわかりませんが、そこまでです.

  • データベースの作成
  • クライアントと製品のテーブルを作成する
  • それぞれにプレースホルダーまたは「ダミー」行を挿入し、相互に参照するように構成します
  • テーブル間に FK 制約を確立する

その後、クライアントまたは製品が作成されるたびに、参照された適切な製品/会社がまだ作成されていない場合は、ダミーのプレースホルダーを指すように新しいアイテムを初期化しました。次にその項目を入力し、最初のエントリを更新して完了します。

利点は、データベースの初期化ルーチンが完了すると、完全な参照整合性が得られることです。また、おそらく非常に制御された状況で一度だけ実行するので、注意深く監視して、失敗しないようにしてください。マイナス面ではないのは、各テーブルに「余分な」アイテムがあり、システムが乱雑になっていることです。

于 2009-09-08T17:11:54.930 に答える