Hierarchy

如何正確創建具有多列自引用另一行的表?

  • September 7, 2016
EmpNo |名稱 | 報告至 | 房間
10 | 導演 | 空 | 1
20 | 高級經理 | 10 | 2
30 | 打字員 | 20 | (這個人指的是empno 10 房間)
40 | 程序員 | 30 | 4

如何正確讓 EmpNo 30 的房間指代他的老闆’,而不是讓 EmpNo 40 指代他的老闆’?

在關係模型中,每一行代表一個代表單個項目的數據集,因此您不要“引用”另一行的值。

員工與其他員工共享房間的概念實際上類似於您已經擁有的員工與經理的關係。這可以在表格中類似地表示,如下所示:

EmpNo |名稱 | 報告至 | SharesRoomWith | 房間
10 | 導演 | 空 | 空 | 1
20 | 高級經理 | 10 | 空 | 2
30 | 打字員 | 20 | 10 | 空值
40 | 程序員 | 30 | 空 | 4

SharesRoomWith 中的 NULL 表示員工有自己的房間。然後,您可以查詢員工及其房間的列表:

-- Employees that have their own room
select
   e.EmpNo,
   e.Designation,
   e.Room
from Employee e
where e.SharesRoomWith is NULL

UNION 
-- Employees that share a room
select
   e.EmpNo,
   e.Designation,
   e.Room
from Employee e

join Employee e2
on e.SharesRoomWith = e2.EmpNo

要得到:

員工編號 | 名稱 | 房間
10 | 導演 | 1
20 | 高級經理 | 2
30 | 打字員 | 1
40 | 程序員 | 4

這樣做的結果是,如果 Director 更改房間,則僅在一個位置(房間號)進行更新,並且打字員的房間也將反映該更改。

請注意,此設計未完全標準化,因此可能不是理想的解決方案,但至少展示瞭如何表示這種關係。

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