質問:テーブルに「ショートカット」識別子を入れて、必要な情報を得るために長い文字列を使用する必要はありませんか?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_id
とaffiliate_id
の列を使用して循環参照がありますか?これは悪いことですか?私はこの周りに頭を包むのに苦労している。
誰かがログインすると、ユーザーの資格情報がユーザーテーブルと照合され、users
が使用されます。 contact_id
,users
。 client_id
およびusers
。 affiliate_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を使用しています。
なぜ "as"エイリアスを使用しないのですか? –