SQL“快捷方式”标识符还是一长串连接?

时间:2011-08-06 21:43:39

标签: mysql sql one-to-many foreign-key-relationship one-to-one

问题:在表中是否可以使用“快捷方式”标识符,这样我就不必进行长串联接来获取所需的信息?

为了理解我在说什么,我将不得不在这里展示一个看起来相当复杂的例子,但我在这里简化了这个问题,应该很容易理解(我希望)

基本设置:“ 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

我们的数据库中有四家公司。

`Affiliates` table
---------------------
ID  Company_ID  Price  Sales
--  ----------  -----  -----
 1           1     50    456
 2           4     50    222
 3           1     75     14

每家公司都可以拥有多个会员ID,以便他们能够以不同的价格代表不同市场的产品。

我们的两家公司是附属公司(Acme,Inc。和Stark Industries),而Acme有两家附属公司

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

每家公司只能成为客户一次。

我们的三家公司是客户(Spacely Space Sprockets,Cogswell Cogs和Stark Industries,他们也是一家子公司)
在所有这三种情况下,他们都是由Acme,Inc。使用他们的两个会员ID中的一个提交给我们的

`Contacts` table
-----------------------------------------
ID  Name            Email
--  --------------  ---------------------
 1  Wylie Coyote    wcoyote@acme.com
 2  Cosmo Spacely   boss@spacely.com
 3  H. G. Cogswell  ceo@cogs.com
 4  Tony Stark      tony@stark.com
 5  Homer Simpson   simpson@burnscorp.com

每家公司至少有一个联系人,但在此表中,没有迹象表明每个联系人都在哪个公司工作,并且还有一个额外的联系人(#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

将联系人与一家或多家公司联系 每个联系人都与公司联系,此外,联系人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(Wylie Coyote)为公司1(Acme)工作,是客户(1)和附属公司(1)
联系人2(Cosmo Spacely)适用于公司2(Spacely Space Sprockets),是客户(2)但不是联营公司 等...

现在终于解决了这个问题,如果有的话......

我是否通过client_id表格中的affiliate_idUsers列进行了循环引用?这是坏事吗?我很难绕过这个。

当有人登录时,它会根据用户表检查其凭据并使用userscontact_idusersclient_idusers。{ {1}}快速查找,而不是必须将一串表连接在一起以找出相同的信息。但这会导致数据重复。

affiliate_id表中没有client_id,我必须找到以下信息:

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`

在每种情况下,我都不一定知道用户是否在users表或affiliate表中都有一个条目,因为它们可能只在其中一个表中有一个条目,不是两个。

进行这些类型的连接并通过多个表来获取我想要的信息是否更好?或者更好的是有一个“快捷方式”字段来获取我想要的信息?

我有一种感觉,总的来说,这在某种程度上过于复杂,但我不知道如何。

我正在使用MySQL。

1 个答案:

答案 0 :(得分:2)

最好进行连接。只有在有时间证据表明响应缓慢时,才应该对数据进行非规范化。

话虽如此,有多种方法可以减少打字数量:

  1. 使用“as”为您的字段添加更短的名称
  2. 创建视图。这些是已经内置标准连接的“虚拟表”,因此您不必每次都重复这些内容。
  3. 在sql中使用“with”。这使您可以在单个查询中定义类似于视图的内容。
  4. 可能mysql不支持以上所有 - 你需要检查文档[更新:好的,最近的mysql似乎支持视图,但不支持“with”。因此,您可以添加视图来执行affiliate_id,client_id等工作,并将它们视为查询中的表,但保持基础数据的组织良好。]