アプリのこの部分の開発をしばらく延期しているのは、これを循環的な方法で実行したいからですが、学校で講師が教えてくれたのを覚えているので、それは悪い考えだと感じています。
私が残したこの例に関係のないものはすべて無視して、注文システムの設計があります。
- クレジットカード
- お客様
- 注文
そうして欲しい、
- 顧客はクレジットカードを持つことができます (0-n)
- 顧客からの注文 (1-n)
- 注文には 1 人の顧客がいます (1-1)
- 注文には 1 枚のクレジット カードがあります (1-1)
- クレジット カードは 1 人の顧客を持つことができます (1-1) (一意の ID であるため、cc 番号の一意性を無視できます。夫/妻は cc インスタンスなどを共有できます)
基本的に、最後の部分は問題が発生する場所です。クレジット カードが拒否され、別のカードを使用したい場合があります。これは、「現在の」カードを更新する必要がありますが、これはその注文に使用されている現在のカードを変更するだけであり、変更することはできません。顧客がディスク上に持っている可能性のある他の注文。
これにより、3 つのテーブル間に円形のデザインが効果的に作成されます。
考えられる解決策: どちらか
円形のデザインを作成し、参照を与えます:
- cc ref 注文、
- お客様の cc への参照
- 顧客参照注文
また
- お客様の cc への参照
- 顧客参照注文
- 3 つすべてのテーブル ID を参照する新しいテーブルを作成し、注文に固有のものを配置して、常に 1 つの cc のみがその注文に対して最新であるようにします。
基本的に、どちらも同じデザインをモデル化していますが、解釈が異なります。現時点では後者のオプションが最も気に入っています。(それが理にかなっていれば)
私の質問は、
- それぞれの長所と短所がある場合はどうなりますか?
- 循環関係/依存関係の落とし穴は何ですか?
- これはルールの有効な例外ですか?
- 後者よりも前者を選ぶべき理由はありますか?
ありがとうございます。明確化/説明が必要なことがあればお知らせください。
--更新・編集--
記載した要件に誤りがあることに気付きました。SOの物事を単純化しようとすると、基本的にボールを落としました。別のレイヤーを追加する Payments 用の別のテーブルがあります。難点は、注文には複数の支払いがあり、異なるクレジット カードを使用できる可能性があることです。(他の支払い方法についても知りたい場合)。
根本的な問題は依然として同じであり、これは実際には別の複雑さのレイヤーを追加するだけだと思うので、ここでこれを述べます.