因爲你沒有張貼您模式作爲SQL DDL,我在看到這些表是如何工作的問題實踐。這裏是我的嘗試:
這似乎是一個合理的假設一個僱員必須是一個人,所以這是很容易的(猜測數據類型和域規則):
CREATE TABLE NaturalPersons
(
PersonId INTEGER NOT NULL UNIQUE
);
CREATE TABLE Employees
(
PersonId INTEGER NOT NULL UNIQUE
REFERENCES NaturalPersons (PersonId),
EmployeeID CHAR(3) NOT NULL UNIQUE
CHECK (EmployeeID LIKE '[A-Z][0-9][0-9]')
);
表名「PersonData」沒有按」牛逼透露太多,但是從數據元素的名稱似乎有些事情是從一個人/員工轉移到另一個:
CREATE TABLE Transfers
(
FromPersonId INTEGER
REFERENCES NaturalPersons (PersonId),
FromEmployeeID CHAR(3)
REFERENCES Employees (EmployeeID),
ToPersonId INTEGER
REFERENCES NaturalPersons (PersonId),
ToEmployeeID CHAR(3)
REFERENCES Employees (EmployeeID)
);
嗯,所有NULL
能夠列意味着我們不能有一個PRIMARY KEY
,但我不知道是否有一個關鍵... ...?
我們只想要一個ID類型爲「從」和「爲」:
ALTER TABLE Transfers ADD
CONSTRAINT only_one_from_ID
CHECK (
(FromPersonId IS NULL AND FromEmployeeID IS NOT NULL)
OR
(FromPersonId IS NOT NULL AND FromEmployeeID IS NULL)
);
ALTER TABLE Transfers ADD
CONSTRAINT only_one_to_ID
CHECK (
(ToPersonId IS NULL AND ToEmployeeID IS NOT NULL)
OR
(ToPersonId IS NOT NULL AND ToEmployeeID IS NULL)
);
我們也會希望有一個「常識」的業務規則,以防止傳輸往返於同一個人/員工:
ALTER TABLE Transfers ADD
CONSTRAINT FromPersonId_cannot_be_ToPersonId
CHECK (FromPersonId <> ToPersonId);
ALTER TABLE Transfers ADD
CONSTRAINT FromEmployeeId_cannot_be_ToEmployeeId
CHECK (FromEmployeeId <> ToEmployeeId);
這是對我們能做的最好的,但是我們有幾個問題:
INSERT INTO NaturalPersons (PersonId) VALUES (1), (2), (3), (4);
INSERT INTO Employees (PersonId, EmployeeID) VALUES (1, 'A11'), (2, 'B22');
-- transfer to same entity - oops!:
INSERT INTO Transfers (FromPersonId, ToEmployeeID) VALUES (1, 'A11');
-- Duplicate transfer - oops!:
INSERT INTO Transfers (FromEmployeeId, ToPersonID) VALUES (1, 'B1'); -- duplicate
INSERT INTO Transfers (FromPersonId, ToEmployeeID) VALUES ('A1', 2); -- duplicate
換句話說,將PersonId和EmployeeID混合在同一個表中使得編寫基本數據規則變得困難。
如果我正確地假設僱員是一個人,爲什麼不只是使用PersonID?
如果員工不是一個人,您可以發佈您的模式(數據類型,約束等)嗎?
如果您對「正確」做事感興趣 - 您的表格結構有異味(或者我不明白您在做什麼)。這似乎應該是一個簡單的兩列關聯表,具有PersonID和EmployeeID。空列有什麼意義? – harpo 2010-06-29 06:59:40
@Harpo這是一箇舊的應用程序,我正在遷移的數據,它是這樣做回來像10-15年前... – VoodooChild 2010-06-29 07:05:04
爲什麼獲得更多的結果比PersonData中的結果不正確?如果您具有FromPersonID和ToPersonID的值,那麼您的加入將匹配Person表中的2條記錄。 – 2010-06-29 07:10:05