【问题标题】:SQL "shortcut" identifiers or a long string of joins?SQL“快捷方式”标识符或一长串连接?
【发布时间】:2011-08-06 21:43:39
【问题描述】:

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

为了理解我在说什么,我将不得不在这里举一个看起来很复杂的例子,但我已经在这里简化了很多问题,它应该很容易理解(我希望) .

基本设置:“company”可以是“affiliate”、“client”或两个都。每个“公司”可以有多个“contacts”,其中一些可以是具有登录权限的“users”。

`公司`表 ---------------------------------------------- ID Company_Name 地址 -- ---------------------- ----- 1 Acme, Inc. 101 塞拉维斯塔 2 Spacely Space Sprockets 东火星殖民地 3 Cogswell Cogs 西火星殖民地 4 Stark Industries 加利福尼亚州洛杉矶

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

`附属机构`表 --------------------- ID公司_ID价格销售 -- ---------- ----- ----- 1 1 50 456 2 4 50 222 3 1 75 14

每家公司可以有多个附属 ID,以便它们可以向不同市场展示不同定价水平的产品。

我们的两家公司是附属公司(Acme, Inc. 和 Stark Industries),Acme 有两个附属 ID

`客户`表 -------------------------------------- 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 之一推荐给我们的

`联系人`表 ----------------------------------------- ID 姓名 电子邮件 -- -------------- --------- 1 Wylie Coyote wcoyote@acme.com 2 Cosmo Spacely boss@spacely.com 3 H. G. Cogswell ceo@cogs.com 4 托尼·斯塔克 tony@stark.com 5 荷马辛普森 simpson@burnscorp.com

每个公司至少有一个联系人,但在此表中,没有说明每个联系人工作于哪个公司,并且还有一个额外的联系人(#5)。我们稍后会讨论。
这些联系人中的每一个都可能有也可能没有系统上的登录帐户。

`Contacts_type` 表 -------------------------------------- 联系人 ID 公司 ID 联系人类型 ---------- ---------- -------------- 1 1 行政 2 2 行政 3 3 行政 4 4 行政 5 1 技术 4 2 技术

将联系人与一家或多家公司联系起来。
每个联系人都与一家公司相关联,此外,联系人 5 (Homer Simpson) 是 Acme, Inc 的技术联系人,联系人 4 (Tony Stark) 既是公司 4 (Stark Industries) 的管理联系人,也是技术联系人公司 3(Cogswell Cogs)的联系人

`用户`表 -------------------------------------------------- ---------------------------------- ID contact_id company_id client_id associate_id user_id password access_level -- ---------- ---------- --------- ------------ -------- - -------- ------------ 1 1 1 1 1 威利 A03BA951 2 2 2 2 2 NULL cosmo BF16DA77 3 3 3 3 3 空齿槽 39F56ACD 3 4 4 4 4 2 铁人 DFA9301A 2

users 表本质上是一个允许登录系统的联系人列表。
每个联系人零个或一个用户;每个用户一个联系人。

联系人 1 (Wylie Coyote) 为公司 1 (Acme) 工作,是客户 (1) 也是附属公司 (1)
联系人 2 (Cosmo Spacely) 为公司 2 (Spacely Space Sprockets) 工作,是客户 (2) 但不是附属公司
等等……

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

我是否通过Users 表中的client_idaffiliate_id 列进行循环引用?这是坏事吗?我很难理解这一点。

当有人登录时,它会根据用户表检查他们的凭据,并使用 users.contact_idusers.client_idusers.affiliate_id 进行快速查找,而不是使用必须将一串表连接在一起才能找出相同的信息。但这会导致数据重复。

如果users 表中没有client_id,我将不得不像这样找到以下信息:

affiliate_id:将 `users`.`contact_id` 加入 `contacts_types`。`company_id` 加入 `affiliates`.`company_id` client_id:将 `users`.`contact_id` 加入 `contacts_types`。`company_id` 加入 `clients`.`company_id` company_id:将`users`.`contact_id`加入到`contacts_types`。`company_id`到`company`。`company_id` 用户名:将 `users`.`contact_id` 加入 `contacts_types`。`contact_id` 加入 `contacts`。`contact_id` > `name`

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

是做这些类型的连接和线程通过多个表来获取我想要的信息更好,还是有一个“快捷方式”字段来获取我想要的信息更好?

我有一种感觉,总的来说,这在某些方面过于复杂,但我不明白如何。

我正在使用 MySQL。

【问题讨论】:

  • 为什么不使用“as”别名?

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


【解决方案1】:

最好进行连接。只有当您有缓慢响应的定时证据时,您才应该对数据进行非规范化。

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

  1. 使用“as”为您的字段提供较短的名称
  2. 创建视图。这些是已经内置标准联接的“虚拟表”,因此您不必每次都重复这些内容。
  3. 在 sql 中使用“with”。这使您可以在单个查询中定义类似于视图的内容。

mysql 可能不支持以上所有内容 - 你需要查看文档 [更新:好的,最近的 mysql 似乎支持视图,但不支持“with”。因此您可以添加视图来完成affiliate_id、client_id 等的工作,并将它们视为查询中的表,但要保持底层数据井井有条。]

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2011-01-09
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多