Database-Design

如果A在B旁邊,如何自動斷言B在A旁邊

  • January 10, 2012

我在 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,我發現它在Band旁邊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 xis next to ythen yis next to x.

(或者更好的方式來建構這些數據!!)

用人類的術語來說,我看到上面的記錄 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

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