循環依存関係がよく説明されている優れたリソースを探している間、残念ながら優れたリソースは見つかりませんでした。したがって、回避すべき循環依存の種類を正確に理解しようとしました。問題は、矛盾する方法で説明するリソースを見つけたことです。誰かがどのタイプの循環依存関係を避けるべきかを正確に説明できますか?
これらの関係を例にとると:
この関係は、ここではbadと記載されています(理由はわかりません)。
ただし、同じ関係が問題ではない(そして[〜#〜] not [〜#〜]循環)ここに:
Models <--------------------------- SuperSets
^ ^
| |
| |
Tasks <---------------------------- Sets
別の例はこれです:
また、なぜこれが循環関係にあるのかわかりません。
以前の関係はすべて、曲線的ではないように見えます(矢印の方向が同じ点に戻ることはありません)。循環従属項の理解に問題があると思います。誰かが私に一般的に、特に前の例についても説明してくれませんか?
これらのケースのいずれにも循環はありません。 「循環参照」シナリオでは、「鶏と卵の問題」があります。次のように、他のテーブルへの参照が常に欠落しているため、テーブルに行を挿入できません。
user {user_id、address_id、...} PK {user_id} FOREIGN KEY {address_id} REFERENCES address - - address {address_id、user_id、...} PK {address_id} FOREIGN KEY {user_id}リファレンスユーザー
その記事の作成者が抱えている唯一の問題は、データベースの設計を理解していないことです。彼の例の問題は、単一列のPK(ID)に対する主張から生じた単純な設計であり、ビジネスロジックがDB制約にどのように関連しているかを理解していません。
2番目の例では、彼のデザインは、実際の購入ではなく、ユーザーと製品に基づいてリセラーのコミッションを割り当てます。最初の例では、プロジェクトスコープ外のタスクにユーザーを割り当てることができます。ここでも「循環」とは関係ありませんが、制約の実装方法がわかりません。
2番目の例では、次のようなものを検討します。
製品{ProductID} PK {ProductID} Customer {CustomerID} PK {CustomerID} Reseller {ResellerID} PK {ResellerID} - - Purchase {PurchaseID、CustomerID、ProductID、ResellerID、.. 。} PK {PurchaseID} FOREIGN KEY {CustomerID} REFERENCES Customer FOREIGN KEY {ProductID} REFERENCES Product FOREIGN KEY {ResellerID}リファレンスリセラー
また、Commission
テーブルを主張する場合は、すべての購入にリセラーが含まれるとは限らないことを伝えます。
製品{ProductID} PK {ProductID} Customer {CustomerID} PK {CustomerID} Reseller {ResellerID} PK {ResellerID} - - Purchase {PurchaseID、CustomerID、Product_ID、...} PK {PurchaseID} FOREIGN KEY {CustomerID} REFERENCES Customer FOREIGN KEY {ProductID} REFERENCES Product - - Commission {PurchaseID、ResellerID、...} PK {PurchaseID} FOREIGN KEY {PurchaseID } REFERENCES Purchase FOREIGN KEY {ResellerID} REFERENCES Reseller
そして最初の例では:
プロジェクト{ProjectID、...} PK {ProjectID} ユーザー{UserID、...} PK {UserID} TaskType {TypeID、...} PK {TypeID} ProjectRole {RoleID、...} PK {RoleID} - - Task {TaskID、ProjectID、TypeID、...} PK {TaskID} AK {TaskID、ProjectID} FOREIGN KEY {ProjectID} REFERENCES Project FOREIGN KEY {TypeID} REFERENCES TaskType - - ProjectTeam {UserID、ProjectID、RoleID、...} PK {UserID、ProjectID} FOREIGN KEY {UserID} REFERENCESユーザー FOREIGN KEY {ProjectID} REFERENCESプロジェクト FOREIGN KEY {RoleID} REFERENCES ProjectRole - - ProjectAssignment {UserID、ProjectID、TaskID、...} PK {UserID、ProjectID、TaskID} FOREIGN KEY {UserID、ProjectID} REFERENCES ProjectTeam FOREIGN KEY {TaskID、Pro jectID} REFERENCESタスク
単一列PKs
を使用する場合は、それらをProjectAssignment
およびProjectTeam
テーブルに追加できますが、既存のものをAKs
として保持する必要があります(一意)そして、該当する場合は外部キーでそれらを参照します。
注PK =主キー AK =代替キー(一意) すべての属性(列)NOT NULL