问题:在表中是否可以使用“快捷方式”标识符,这样我就不必进行长串联接来获取所需的信息?
为了理解我在说什么,我将不得不在这里展示一个看起来相当复杂的例子,但我在这里简化了这个问题,应该很容易理解(我希望)
基本设置:“ 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_id
和Users
列进行了循环引用?这是坏事吗?我很难绕过这个。
当有人登录时,它会根据用户表检查其凭据并使用users
。contact_id
,users
。client_id
和users
。{ {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。
答案 0 :(得分:2)
最好进行连接。只有在有时间证据表明响应缓慢时,才应该对数据进行非规范化。
话虽如此,有多种方法可以减少打字数量:
可能mysql不支持以上所有 - 你需要检查文档[更新:好的,最近的mysql似乎支持视图,但不支持“with”。因此,您可以添加视图来执行affiliate_id,client_id等工作,并将它们视为查询中的表,但保持基础数据的组织良好。]