2012-09-01 166 views
1

關於最有效快速的問題是要解決這個問題,我有一個具有用戶類型的樹形結構的數據庫,存儲多個電子郵件地址

system --- 1 to m --- account --- 1 to m --- customer 

所有這三種類型可以有多個電子郵件地址,我想知道什麼是在數據庫中處理這種情況的最佳方式,所有用戶類型都有auto_id作爲其主鍵,因此具有由相關主鍵標識的地址的表將不會工作,因爲每個類型中可能有3個。例如帶有密鑰2的電子郵件將鏈接到系統ID 2,帳戶ID 2等。

我應該爲每種類型創建一個電子郵件地址表。還是有更優雅的解決方案?

感謝

回答

1

你要麼有一個外鍵既不是一個SYSTEM_ID,ACCOUNT_ID,或CUSTOMER_ID電子郵件表。然後你可以有一個指定該外鍵類型的字段。另一個更復雜的策略是擁有電子郵件表,但沒有外鍵。另一個表,您可以調用email_relation由email_id和外鍵組成。這樣你可以爲所有三個表使用一個電子郵件地址。

使用兩個表

system 
-------- 
s1 
s2 
s3 

account 
-------- 
a1 
a2 
a3 

customer 
-------- 
c1 
c2 
c3 

email 
------ 
e1 [email protected] 
e2 [email protected] 
e3 [email protected] 
e4 [email protected] 

email_relation 
--------------- 
email_id  foreign_id  relation_type 
e1   s1    system 
e1   a1    account 
e1   c1    customer 
e2   c1    customer 
e3   c2    customer 
e4   a3    account 
e4   c3    customer 

的例子,如果你想客戶表,包括電子郵件地址

select c.customer_id, e.email 
from customer c 
left join email_relation r on (r.foreign_id = c.customer_id and relation_type = 'customer') 
left join email   e on (e.email_id = r.email_id) 
where r.email_id is not null 

如果你希望所有的電子郵件系統,你也可以

select e.email 
    from email e 
    join email_relation r on (r.email_id = e.email_id and relation_type = "system") 
where r.foreign_id = 1 
+0

好吧我喜歡這種soloution,我一直在尋找創造堆肥的關鍵選項,我有這個帖子http://stackoverflow.com/a/5836504/1401319這表明,也許我會保持ids在單獨的列如所暗示的,除了我將如何選擇特定系統的電子郵件, –

+0

我是否僅在帳戶和客戶列中使用佔位符值,例如「選擇*從電子郵件WHERE系統= 1和帳戶= 0和客戶= 0」返回系統的電子郵件的詳細信息...希望這是有道理的..? –

+0

太多字符與我的帖子混淆,我正在尋找的是「SELECT * FROM email WHERE system = 1」這一事實的解決方案將返回所有與sys1相關的電子郵件,而不是sys1的電子郵件。 –

0

你可以構建一個複合鍵在層次結構的任何級別標識記錄,然後將其用作電子郵件表格中的FK。所以一個電子郵件記錄可能指向sys1.acc7,其他一些可能指向sys3.acc4.cus99。組合鍵由以任何對您的系統有意義的方式串聯在一起的auto_ids組成。

您可以爲層次結構中的任意點確定此組合鍵,然後從中找到該點的所有相應電子郵件地址。

相關問題