2016-09-08 27 views
0

考慮我們有一個SQL表客戶enter image description hereSQL,並且不需要使用創建表的外鍵

現在考慮,如果我們有,他們的兩列customer_nameorders_name現在一個客戶可能有多個訂單表(一對多的關係)所以我們有表格,我們選擇customer_name作爲foriegn鍵。但是現在考慮我們對一個customer_name有100個訂單,所以我們必須編寫相同的customer_name 100次。記憶的腰部。

customer_name,customer_orders

enter image description here
,所以我當時的想法是我們不能只讓表CUSTOMER_NAME的訂單的名稱,examle如果我們有CUSTOMER_NAME法案,所以我們可以創建一個表法案的訂單的名稱,寫在所有他的命令,現在我們不使用任何foriegn鍵,

bill's orders

enter image description here

以及我們可以爲其他用戶創建的更多表,以便在從主表中刪除customer_name時如何刪除表。任何想法?

+0

沒有沒有沒有,再沒有 – RiggsFolly

+0

如果你想看到賬單訂單查詢訂單表,其中客戶=「賬單」 – RiggsFolly

+0

如果沒有其他(數據庫設計的原因),比如果你有10,000名客戶,您將有10,000個表 – RiggsFolly

回答

2

您使用代理鍵解決了浪費空間的問題。您可以使用更緊湊的數據類型(byteint,smallint,int等)創建一個排序標識,而不是將大數字字段(名稱)複製到子表中。在您創建一個單獨的表中的每個客戶,您提出的方法,你會遇到以下問題:

  • 不能運行跨客戶,即聚集,你不能簡單地做一個總和,平均,最小等對於兩組客戶切片數據不同的方式
  • SQL會複雜得多,每個額外的客戶加入到查詢
  • 您的數據字典是要增長巨大,並在某些時候你會招致不屬於重大的性能問題易修復

po使用關係數據庫的int是爲了允許用戶動態地分片和分片數據。您提出的方法對查詢沒有用處。