Relations

目前或一段時間內表之間的基數?

  • February 3, 2021

我對兩張表之間的基數有疑問。我不知道如何處理它。

想像一下:

有組:第 1 組、第 2 組、第 3 組等

一個組可以有多個項目,這些項目只能在其中一個組中。一家商店只能有一組商品,並且一次可以在一個商店中擁有一組商品,因此您可以說一家商店擁有一組。像這樣,group 和 store 的基數是 1:1。但是,隨著時間的推移,商店之間的組會發生變化,因此每個 stroe 都會改變它擁有的組,但組不會在商店之間重複。所以,商店會不時地交換組。

問題是我不確定它是否仍然是 1:1 或者它可以被視為 1:N,如果您認為它是長期的事情,如果我想註冊更改日期,更是如此.

而且,這整個事情導致了一種三元關係,因為商店可以銷售同時在一個組中的多個項目,並且只能在一組項目中,但是這個組一次只有一個商店擁有,但是,這家商店會隨著時間的推移交換組。所以這讓我的頭爆炸。

我認為您的模型中可能缺少一個實體。隨著時間的推移,一個商店可以與多個組相關聯,一個組可以與多個商店相關聯,因此除非您只想記錄目前狀態而沒有歷史記錄,否則您將擁有 N:M 關係並需要一個聯結表。就像是:

Store      StoreGroup                        Item
=====      ==========       Group            =============
Id   <---- StoreId          ==========       Id
          GroupId    ----> Id         <---- GroupId
          StartTime        GroupProp1       ItemProperty1
          EndTime          GroupProp2       ItemProperty2

不幸的是,您可能需要在應用程序層中強制執行“一個商店一次一組”規則,或者使用觸發器,我不確定 SQL 約束是否足夠。

作為直接建模隨時間變化的替代方案,如果您使用的數據庫支持時態表(有時稱為“系統版本化”),您可以使用該功能。

然後你可以擁有:

Store      Group            Item
=====      ==========       =============
Id   <---- StoreId          Id
          Id         <---- GroupId
          GroupProp1       ItemProperty1
          GroupProp2       ItemProperty2

並且一組有一個商店是通過只能在一個組的數據中擁有一個商店來強制執行的,並且每個商店一個組可以通過對 的唯一約束來強制執行Group.StoreId。但是我可能會推薦另一種方法,除非您可以保證“一組一商店”規則將適用於未來的版本(這似乎異常地限制了我的想法),因為前一種方法更容易重構以提供更大的靈活性.

引用自:https://dba.stackexchange.com/questions/284593