【问题标题】:How to spot the relationship in RDBMS?如何发现 RDBMS 中的关系?
【发布时间】:2014-10-30 03:58:11
【问题描述】:

我正在研究RDBMS中的关系。我了解映射关系背后的基本概念,但我无法发现它们。

三种可能:

  1. 一对多(最常见)需要一个 PK - FK 关系ip。涉及两个表
  2. 多对多(不太常见)需要一个联结表。涉及三个表
  3. 一对一(非常罕见)。涉及一张桌子。

当我开始一个项目时,我无法将前两个条件分开,而且我的头脑也不清楚。 当我学习时的例子有帮助,但当我需要将这些原则付诸实践时则不然。

这是大多数初学者步履蹒跚的地方。 我怎样才能发现这些关系。有没有更简单的方法?

【问题讨论】:

  • 你能举例说明你的意思吗?
  • 使用哪个选项非常清楚,我不明白为什么你不能发现它。请举一个让你发疯的例子。
  • 这是一个非常笼统的问题。对不起,我不能给你一个例子,但我可以详细说明这个问题。当我们开始处理一个项目时,我们会创建多个表。尽管这些表在以某种方式,我无法发现它。我正在寻找一个非常笼统的答案,以便我至少可以在一张纸上绘制我所有的关系。任何一般的想法都可以。
  • 我建议只创建一个 ER 图,这应该以简单的布局显示您的关系。 See this answer 在 MySQL 中生成 ER 图

标签: mysql sql-server postgresql relational-database relationship


【解决方案1】:

不要从技术角度看待关系。尝试在脑海中设想关系时,请使用类比和现实生活中的例子。

例如,假设我们有一个图书馆数据库。 图书馆必须有书籍

M:M

每个Book 可能已被多个Authors 写入,每个Author 可能已写入多个Books。因此,这是一个多对多关系,将反映到数据库中的 3 个表中。

1:M

每个Book 还必须有一个Publisher,但一个Book 可能只有一个Publisher,而一个Publisher 可以发布多个Books。因此,它是一种一对多关系,它反映了PublisherIdBooks 表中的引用。

像这样一个简单的类比解释了关系的核心。当你试图通过技术镜头来看待它们时,你只会让自己变得更难。真正困难的是在构建数据库时应用真实世界的数据场景。

【讨论】:

    【解决方案2】:

    我认为你没有得到你需要的答案的原因是你提出问题的方式。与其问“我如何发现实体之间正确的关系类型”,不如想想“我的功能需求如何决定要实现什么关系”。数据库设计不驱动功能;正是功能需求推动了您需要实施的关系。

    在设计数据库结构时,您需要识别所有实体。实体是您要存储的所有事实:诸如书名、发票、国家、犬种等的列表。然后,要确定您的关系,您必须考虑要向数据库询问的问题类型。有时需要进行一些前瞻性思考……仅仅因为没有人现在问这个问题并不意味着它可能永远不会被问到。所以你不能问宇宙“这些事实清单之间的关系是什么?”因为没有确定的答案。你定义了宇宙……我只想知道这些问题的答案;因此我需要使用这种类型的关系。

    让我们来看看两个常见实体之间的示例关系:客户表和商店位置表。如果不首先定义您需要了解的有关它们的信息,就没有“正确”的方式来关联这些实体。假设您为一家零售商工作,并且您想为客户指定一个默认商店名称,以便他们可以在网站上看到他们当地商店有库存的产品。这只需要商店和客户之间的一对多关系。以这种方式设计关系可确保一个商店可以有许多客户作为他们的默认客户,而每个客户只能有一个默认商店。要实现这种关系,只需将DefaultStore 字段作为链接到Store 表主键的外键添加到Customer 表中即可。

    上述相同的两个实体可能对不同上下文中的关系定义有不同的要求。假设我需要能够让客户有机会选择最喜欢的商店列表,以便他们可以一次查询所有这些商店的库存信息。这需要多对多关系,因为您希望一个客户能够与许多商店相关联,并且每个商店也可以与许多客户相关联。实现多对多关系需要更多的开销,因为您必须创建一个单独的表来定义关系链接,但是您可以获得这个额外的功能。您可以将您的关系表称为CustomerStoreFavorites 之类的名称,并将其主键作为来自每个实体的组合主键:(CustomerID, StoreID)。您还可以向关系中添加属性,例如可能是 LastOrderDate 字段,以指定客户从特定商店订购商品的最后日期。

    从技术上讲,您可以为相同的两个实体定义两种类型的关系。举个例子:也许您需要让客户选择默认商店,但您还需要能够记录客户从特定商店订购商品的最后日期。您可以使用Store 表的外键在Customer 表上实现DefaultStore 字段创建一个关系表来跟踪客户已订购的所有商店。

    如果您遇到一些奇怪的情况,即每个客户都有自己的商店,那么您甚至不需要为您的实体创建两个表,因为您可以将客户和商店的所有属性都放在一个表中。

    简而言之,确定要实施哪种类型的关系的方式是问自己需要向数据库询问哪些问题。您设计它的方式将限制您可以收集的关系数据以及您可以询问的查询。如果我设计了从商店到客户的一对多关系,我将无法询问有关每个客户订购的所有商店的问题,除非我可以通过其他关系获得该信息。例如,我可以创建一个名为“purchases”的实体,它与客户和商店具有一对多的关系。如果将每次购买定义为与一位客户和一家商店相关,那么现在我可以查询“该客户从哪些商店订购过?”事实上,通过这种结构,我能够捕获和报告关于客户在任何商店的所有购买的更丰富的信息来源。因此,您还需要考虑数据库中所有其他关系的上下文,以决定在两个特定实体之间实现哪种关系。

    没有神奇的公式,所以只需要练习、经验和一点点创造力。 ER 图是一种让您的设计脱离头脑并写在纸上的好方法,这样您就可以分析您的设计并确保您可以回答正确类型的问题。还有很多书籍和资源可以学习数据库架构。我从中学到很多东西的一本好书是 Abraham Silberschatz 和 Henry Korth 的“数据库系统概念”。

    【讨论】:

      【解决方案3】:

      假设您有两个表 A 和 B。考虑 A 中的一个条目,并考虑它最多可能与 B 中的多少个条目相关:只有一个,还是更多?然后考虑 B 中的一个条目,并考虑它可能与 A 中的多少个条目相关。

      一些例子:

      表 A:母亲,表 B:儿童。每个孩子只有一个母亲,但一个母亲可能有一个或多个孩子。母亲和孩子之间是一对多的关系。

      表 A:医生,表 B:患者。每位患者可能会拜访一位或多位医生,并且每位医生治疗一位或多位患者。所以他们有一个多对多的关系。

      【讨论】:

        【解决方案4】:

        一对一的例子: 车辆牌照。一车牌一车一车一车牌。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多