2010-06-25 75 views
1

模型來解釋我的問題,我舉一個簡單的例子:正確的方式關係數據庫

我的數據庫中有三個表:

 
[positions] 
- position_id INT 
- position VARCHAR 

[employees] 
- employee_id INT 
- position_id INT - FK 
- name VARCHAR 
- birth_date DATE 

[vehicles] 
- vehicle_id INT 
- model VARCHAR 
- year VARCHAR 
- color VARCHAR 

的問題是,我必須一個車輛與一個關聯在公司中的職位是「司機」的員工,只有在這種情況下。

我試圖使用繼承並創建另一個名爲「驅動程序」的表有一個ForeignKey與一個員工(1-1關係)相關聯,但我無法使它工作,因爲在編程階段,我將不得不手動驗證所選位置id(在HTML select元素中)是否爲「Driver」的ID。我相信這不是一個好的編程習慣。

總之,我想知道是否有其他方法可以做到這一點,而不會損害關係數據庫或編程。

在此先感謝! 對不起英語不好,這不是我的主要語言。 我希望你能理解。

回答

1

有許多方法可以做各種折衷。斯科特安布勒有一個great page列出替代品與圖表。

+0

謝謝安迪,那個頁面真的幫了我很大的忙! 正是我在找的東西。 在我的情況下,我最終使用了一個通用表格結構,該表格結構還允許用戶向不同類型的公司職位添加額外的字段。 謝謝大家的所有答案。 – Philipe 2010-06-25 13:21:31

2

不幸的是,關係數據庫只是不能創建好的分層對象存儲。你可能會考慮使用某種對象關係模型來僞造它,但你是對的:這不是一個好習慣。也許考慮一個purpose-built object datastore而不是傳統的RDBMS。

5

這是一個業務規則 - 「只有職位=駕駛員才能與車輛相關聯」。業務規則通常在編程中實施,這不是一個壞習慣。編寫用於編寫業務邏輯。一般來說,你會得到大量的這樣的實例,在開發任何應用程序時無法在數據庫級別實現。

但是,如果您仍希望在數據庫級別控制此設置,則可以使用觸發器並在插入/更新級別檢查此驗證。

0

做到這一點的最好方法很可能有一個連接員工和車輛的表EmployeeVehicles。是的,這意味着您的應用程序(或者觸發器或存儲過程)必須確保只有特定類型的Employee實際上在EmployeeVehicles中有記錄,但這些通常是存儲業務邏輯的最佳位置。數據庫在那裏以儘可能最正常的方式存儲數據,而不是跟蹤業務特定的規則。據他們所知,一些員工(0 .. *)可能有車輛(1 .. *,或者1..1)。