2015-03-03 175 views
1

我在數據庫設計中很安靜,我正在嘗試一個測試用例來跟蹤學生。 在下圖中,學生可以在學校或俱樂部。爲此,我在LocationId上創建了一個作爲全球學生身份的地方。 enter image description here規範化數據庫表

但問題是我根據TypeId來確定其俱樂部或學校。 所以在我的數據訪問查詢中,我必須提供案例。僞代碼是:

if TypeId == 1 
search in club for the LocationId and get the clubId. 
else if TypeId == 2 
search in school for the LocationId and get the schoolId. 

我該如何擺脫這些情況,仍然保持規範化的規則。

非常感謝您的閱讀。歡迎任何評論。 美好的一天!

+1

不知道你是否需要'LOC_CONTAINER'表。你可以用'CLUB'和'SCHOOL'表將'left join'加入,只使用你需要的字段。 – keltar 2015-03-03 10:27:21

+0

你的意思是完全擺脫LocationId?可否請您在解決方案中寫下查詢。 – ThomasBecker 2015-03-03 10:32:51

+1

如何將您的SCHOOL和CLUB表合併在一起,並添加額外的列作爲TYPE來區分它們,在這種情況下,您也可以刪除LOC_CONTAINER。 – 2015-03-03 10:33:39

回答

0

這似乎是表繼承的情況,並有多種方法來解決它。您的解決方案LOC_CONTAINER不起作用(因爲您已經注意到),因爲它需要外部代碼來執行檢查。

看看關於繼承的this comprehensive answer。例如,可以將SCHOOLCLUB表統一爲一個表,稱爲PLACE,或者在表STUDENT中同時包含SCHOOLCLUB列,其中一個表必須爲NULL

+0

謝謝,但我不能合併學校和俱樂部,因爲後來它會有所不同,加入是其他同事提到的選項,但表之間的關係,然後丟失,這可能是客戶端使用dataservice所需的。 – ThomasBecker 2015-03-03 11:02:14

+0

好的,看看我鏈接到的答案中提供的類表繼承情況。在這種情況下,學校和俱樂部的主鍵都會引用公共表格,與「LOC_CONTAINER」不同。 – 2015-03-03 11:21:56

+0

再次感謝我查看類表繼承的ur鏈接,它非常接近解決我的問題,只有問題我有例如。 X有policyId如何可能知道它是否有「property_address」或「vehicle_reg_no」,一種方法是在所有子表中搜索policy_id,但我猜它是不好的方法。在我的情況下,它通過了解位置來反映它是如何知道它是否在學校或俱樂部。我希望你得到點。 – ThomasBecker 2015-03-03 13:20:21