2009-02-03 87 views
0

我的數據庫有一個表跟蹤部門和用戶ID。這裏的結論是,儘管department和user_id列可以有重複,但它們的組合不能。這就是說,雙主鍵設計

DepartmentA 0001 
DepartmentA 0002 
DepartmentB 0001 
DepartmentB 0002 

是我的表中的有效數據。但

DepartmentA 0001 
DepartmentA 0001 

有效。

部門和user_id的組合形成記錄的唯一標識符。在另一個表中,我需要使用這個唯一的標識符來跟蹤用戶的活動,比如他們進入建築物的時間,他們離開建築物的時間等。

我在想的是我創建了下列表格

CREATE TABLE user (
user_id INT(4), 
department VARCHAR(25) NOT NULL , 
combined_id int(4) , 
UNIQUE (combined_id) , 
Primary key(user_id, department) 
); 



CREATE TABLE user_activity(
combined_id int(4), 
activity varchar(25), 
Foreign Key (combined_id) references user(combined_id) 
); 

所以我想爲我的目的使用雙主鍵。這是恕我直言,是保證數據完整性的最佳方式。但是根據我所知,使用雙主鍵可能很難與ORM一起使用,即它們不完全支持,並且必須爲其編寫定製查詢。

鑑於我的情況,上述設計是否最好?

+0

什麼是平臺? – 2009-02-03 11:59:27

+0

其中ORM?這比數據庫更有可能重要。 – 2009-02-03 12:02:55

+0

Propel和ADO.Net實體框架 – Graviton 2009-02-03 12:05:24

回答

9

我會使用代理主鍵,並對這兩個字段的組合應該保持唯一的唯一約束。

也就是說,我不認爲我的員工編號是主鍵。這有利於很多場景。

所以,這是我會做什麼

CREATE TABLE Employee 
(
    EmployeeId INT , 
    EmployeeNumber VARCHAR(4), 
    DepartmentId INT, 
    EmployeeName 
) 

CREATE TABLE Department 
(
    DepartmentId INT, 
    DepartmentName 
) 

在僱員表,僱員的主鍵。該列只包含一個數字,在問題域中沒有意義。它在數據庫中僅具有管理含義(唯一標識一個員工)。

EmployeeNumber包含'用於標識員工的業務/域號碼'。請注意,我已將此字段設置爲VARCHAR字段,因爲您在示例中將LPAD的數字設爲零。所以實際上,它不應該是一個數字字段。 :)

接下來,Employees表中還有一個DepartmentId列,它是Department表的外鍵。 在Employee表中,您應該在EmployeeNumber/DepartmentId字段上添加唯一約束。 (所以,對兩列的組合有一個約束)。

然後,User_Activity表可以只是看起來像這樣:

CREATE TABLE User_Activity 
(
    EmployeeId INT, 
    ActivityId INT 
) 

(我知道CREATE TABLE語句是不是真的實際正確的SQL語句,但是這僅僅是用於說明目的offcourse)。

0

我會創建您的主鍵作爲User_ID和Department上的組合,並在該表中具有另一個字段,即身份/自動增量字段(也包含唯一索引),並將THAT值用作FK參考到其他領域。

這假設你不會經常刪除並重新創建用戶/部門對(因爲每次都會打斷與下屬表的關聯),在這種情況下,使用組合鍵作爲您的組合鍵可能更有意義FK參考。

0

我建議讓代理標識符作爲主鍵,複合user_id和部門密鑰作爲備用唯一鍵。

4

只需創建單獨的主鍵,併爲(user_id,department)創建新的唯一索引。