1

最も効率的な質問は、これを処理することでした。ユーザータイプのツリー構造を持つデータベースがあります。

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

3つのタイプすべてが複数の電子メールアドレスを持つことができます。データベースでこれを処理するための最良の方法は何でしょうか。すべてのユーザータイプは主キーとしてauto_idを持っているため、関連する主キーで識別されるアドレスを持つテーブルはそこでは機能しません。それぞれ3つになる可能性があります。たとえば、キー2のメールは、ID 2のシステム、ID2のアカウントなどにリンクします。

タイプごとにメールアドレスのテーブルを作成する必要があります。または、よりエレガントな解決策はありますか?

ありがとう

4

2 に答える 2

1

system_id、account_id、または customer_id のいずれかである外部キーを持つ email テーブルがあります。次に、その外部キーのタイプを指定するフィールドを持つことができます。もう 1 つのより複雑な戦略は、email テーブルを保持し、外部キーを保持しないというものです。email_id と外部キーで構成される、email_relation と呼ばれる別のテーブル。そうすれば、3 つのテーブルすべてに 1 つの電子メール アドレスを使用できます。

2 つのテーブルの使用例

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

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

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

email
------
e1 example1@a.com
e2 example2@a.com
e3 example3@a.com
e4 example4@a.com

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 
于 2012-09-01T08:49:23.280 に答える
0

複合キーを構築して、階層の任意のレベルでレコードを識別し、それを email テーブルの FK として使用できます。したがって、1 つの電子メール レコードが を指しsys1.acc7、他のレコードが を指す可能性がありsys3.acc4.cus99ます。複合キーは、システムにとって意味のある方法で連結された auto_id で構成されます。

階層内の任意のポイントについてこの複合キーを決定し、そこからそのポイントに対応するすべての電子メール アドレスを見つけることができます。

于 2012-09-01T08:49:40.490 に答える