Database-Design
如果A在B旁邊,如何自動斷言B在A旁邊
我在 Access 2010 中工作。
假設我有一個數據庫來跟踪包裹在倉庫中的位置。
Table: Packages PackageID (PK) PackageHeight PackageWidth PackageWeight PackageOwner (etc)
現在我想顯示每個包旁邊的包。
例如,A 緊挨著 B 和 M。
Table: PackageNextTo ID (PK), PackageID (Packages.PackageID, FK), NextToPackageID(Packages.PackageID, FK) 1, A, B 2, A, M
所以當我抬頭時
A
,我發現它在B
and旁邊M
。但是當我查找時
B
,我也想知道它在A
….旁邊,當我查找 M 時,我想知道它在旁邊A
,例如,旁邊T
。(但 M 和 B 不一定彼此相鄰)。我是否必須通過添加如下記錄來明確定義這些關係:Table: PackageNextTo ID (PK, AutoIncrement), PackageID, NextToPackageID 1, A, B 2, A, M 3, B, A 4, M, A 5, M, T 6, T, M
或者有沒有辦法自動說 if
x
is next toy
theny
is next tox
.(或者更好的方式來建構這些數據!!)
用人類的術語來說,我看到上面的記錄 1 和 3 之間,以及上面的 5 和 6 之間的冗餘,等等….但我不知道這是否對數據庫是冗餘的,或者數據庫是否需要明確呼叫它。
如果數據庫需要這個明確的,有沒有辦法執行一個宏或查詢,當定義(A,B)時會自動創建(B,A)?
在您建議的
PackageNextTo
表中,“ID (PK)”似乎是一個代理鍵,大概是一個自動編號。雖然我自己不是代理鍵倡導者,但我知道有些人會在關係表(聯結表、連結表等)中避免使用它們。(PackageID, NextToPackageID)
無論如何,您肯定需要強制執行候選鍵(複合),並且ID
似乎至少有一個在這裡回答的人感到困惑。因此,我建議你省略它。為了確保“next to”關係是單向儲存
CHECK
的,請添加一個約束(或驗證規則),例如CREATE TABLE PackageNextTo ( PackageID CHAR(1) NOT NULL REFERENCES Packages (PackageID) ON DELETE CASCADE ON UPDATE CASCADE, NextToPackageID CHAR(1) NOT NULL REFERENCES Packages (PackageID) ON DELETE CASCADE ON UPDATE CASCADE, CHECK (PackageID < NextToPackageID), UNIQUE (PackageID, NextToPackageID) );
要將所有 ’next to’ 關係顯示為雙向,請使用 a
VIEW
(或以通常的方式創建一個 soted Query 對象)擴展它們:CREATE VIEW AdjacentPackages AS SELECT PackageID AS PackageID_1, NextToPackageID AS PackageID_2 FROM PackageNextTo UNION SELECT NextToPackageID AS PackageID_1, PackageID AS PackageID_2 FROM PackageNextTo;
請注意,
CHECK
並且CREATE VIEW
需要ANSI-92 Query Mode。