1

質問:テーブルに「ショートカット」識別子を入れて、必要な情報を得るために長い文字列を使用する必要はありませんか?SQLの "ショートカット"識別子または長い文字列の結合?

私が話していることを理解するために、私はここでかなり複雑に見える例を載せなければならないでしょうが、私はここでかなり問題を単純化しました。 )。

基本的なセットアップ: "companyは" "affiliate"、 "client" または両方にすることができます。各「会社」は複数の「contacts」を持つことができ、そのうちのいくつかはログイン権限を持つ「users」とすることができます。

 
`Company` table 
---------------------------------------------- 
ID Company_Name    Address 
-- ----------------------- ----------------- 
1 Acme, Inc.    101 Sierra Vista 
2 Spacely Space Sprockets East Mars Colony 
3 Cogswell Cogs   West Mars Colony 
4 Stark Industries   Los Angeles, CA 

私たちのデータベースには4つの企業があります。

各社は、異なる市場に異なる価格レベルで製品を表すことができるように、複数のアフィリエイトIDを持つことができます。私たちの会社の

二つは、関連会社(アクメ、Inc.およびスターク・インダストリーズ)であり、Acme社は2アフィリエイトIDの

 
`Clients` table 
-------------------------------------- 
ID Company_ID Referring_affiliate_id 
-- ---------- ---------------------- 
1   2      1 
2   3      1 
3   4      3 

各企業は一度だけ、クライアントすることができます。私たちの会社の

三3つのすべてのケースでは、クライアント(Spacelyスペーススプロケット、Cogswellコグ、また、関連会社であるスターク・インダストリーズ、)
あり、彼らは自分のものを使用して、アクメ、Inc.によって私たちに呼ばれていました2アフィリエイトIDの

 
`Contacts` table 
----------------------------------------- 
ID Name   Email 
-- -------------- --------------------- 
1 Wylie Coyote [email protected] 
2 Cosmo Spacely [email protected] 
3 H. G. Cogswell [email protected] 
4 Tony Stark  [email protected] 
5 Homer Simpson [email protected] 

各企業は、少なくとも一つの接点を持っていますが、この表では、各連絡先はのために働く、と余分な接触(#5)もありますどの会社の兆候はありません。私たちはすぐにそれに着きます。
これらの連絡先にはそれぞれ、システムにログインアカウントがある場合とない場合があります。

 
`Contacts_type` table 
-------------------------------------- 
contact_id company_id contact_type 
---------- ---------- -------------- 
     1   1 Administrative 
     2   2 Administrative 
     3   3 Administrative 
     4   4 Administrative 
     5   1 Technical 
     4   2 Technical 

1つ以上の企業と連絡先を関連付けます。
各連絡先は会社に関連しており、連絡先5(Homer Simpson)はAcme、Incの技術連絡先であり、連絡先4(Tony Stark)は会社4(Stark Industries)会社3の技術的連絡先(Cogswell Cogs)

 
`Users` table 
------------------------------------------------------------------------------------- 
ID contact_id company_id client_id affiliate_id user_id password access_level 
-- ---------- ---------- --------- ------------ -------- -------- ------------ 
1   1   1   1    1 wylie  A03BA951    2 
2   2   2   2   NULL cosmo  BF16DA77    3 
3   3   3   3   NULL cogswell 39F56ACD    3 
4   4   4   4    2 ironman DFA9301A    2 

usersテーブルは基本的にシステムにログインできる連絡先のリストです。
連絡先ごとにゼロまたは1人のユーザー。ユーザーあたり1つの連絡先。

連絡先1(ワイリーコヨーテ)が会社1(アクメ)のために働き、顧客である(1)ともアフィリエイト(1)
コンタクト2(コスモSpacelyは)会社2(Spacelyスペーススプロケット)のために働くとありますアフィリエイトではなくお客様(2)
など

最終的には問題に、もしあれば...

Usersテーブルのclient_idaffiliate_idの列を使用して循環参照がありますか?これは悪いことですか?私はこの周りに頭を包むのに苦労している。

誰かがログインすると、ユーザーの資格情報がユーザーテーブルと照合され、usersが使用されます。 contact_id,usersclient_idおよびusersaffiliate_idは、同じ情報を見つけるためにテーブルの文字列を結合する必要がなく、すばやく検索することができます。しかし、これはデータの重複を引き起こします。 usersテーブルでclient_idなし

、私はこのような以下の情報を見つけるために必要があります:ユーザーがさえaffiliateにエントリを持っている場合はそれぞれのケースで

 
affiliate_id: join `users`.`contact_id` to `contacts_types`.`company_id` to `affiliates`.`company_id` 
client_id:  join `users`.`contact_id` to `contacts_types`.`company_id` to `clients`.`company_id` 
company_id:  join `users`.`contact_id` to `contacts_types`.`company_id` to `company`.`company_id` 
user's name:  join `users`.`contact_id` to `contacts_types`.`contact_id` to `contacts`.`contact_id` > `name` 

を、私は必ずしも知っているだろうテーブルまたはclientsテーブルのいずれかにエントリがある可能性があります。

これらの種類の結合やスレッドを複数のテーブルで実行して、必要な情報を取得したり、必要な情報を得るための「ショートカット」フィールドを持っている方が良いですか?

私は、全体的に、これは何となく複雑すぎると感じていますが、私はどのように見えません。

私はMySQLを使用しています。

+0

なぜ "as"エイリアスを使用しないのですか? –

答えて

2

ジョインを行う方が良いです。応答が遅いというエビデンスが得られたときにのみ、データを非正規化する必要があります。あなたのフィールド

  • 作成ビューに短い名前を与える「として」

    1. 使用:

      は、タイピングの量を減らすために様々な方法がある、と述べました。これらはすでにあなたの標準的な結合が組み込まれている「仮想テーブル」なので、毎回そのようなことを繰り返す必要はありません。
    2. "with"をSQLで使用します。これにより、単一のクエリ内でビューのようなものを定義できます。

    ことが可能MySQLのは、上記のすべてをサポートしていません - あなたは、ドキュメントをチェックする必要があります[アップデートを:OK、最近のMySQLはビューをサポートするようだが、ではない「と」。 affiliate_id、client_idなどの作業を行うためのビューを追加して、クエリのテーブルと同じように扱いますが、基になるデータをきちんと整理しておくことができます。]