将其他要求合并到遗留数据库设计中

pin*_*ngu 6 mysql sql database database-design

我正在努力进行数据库设计,这是我到目前为止所做的.

模式

这是问题所在.

  1. 我需要引入一个新的用户类型(集合经理),他们将能够看到公司集团(集团).集团经理可以拥有多家公司,公司可以属于多个集团经理.如果可以添加一个独立的公司,然后在以后很容易将其作为集合的一部分包括在内将是有利的.

    我发现这很难建模,因为到目前为止我的所有用户(经理,驱动程序,收件人)都存在于users表中.这是设计,因为他们都有几乎相同的数据字段,我需要为我的网站上的所有用户都有一个登录点.如果我将一个集合管理器添加到users表,它们将与我现有用户类型没有的其他表有关系.

  2. 我对通过用户,所有权,包,公司,用户形成的依赖循环感到不安.这让我感觉很糟糕,但我真的想不出一种避免它的方法:

    经理,司机和收件人都为一家公司工作.该公司有一组相关的软件包,但我需要能够将这些软件包的子集与特定的收件人(他们拥有的软件包)以及特定的驱动程序或管理器(负责提供这些软件包)相关联.

  3. 我对用户中的"receive_emails"字段不满意,因为它仅与"收件人"类型的用户相关.

为了解决这些问题,该设计已经投入使用,数据必须迁移到任何新设计.

系统中最常见的操作是收件人查看状态,然后由经理和驱动程序创建状态.

优雅的新设计可以解决我的问题吗?

Tho*_*ner 1

好吧,这是另一种尝试。我依然觉得

  • 正如我的其他答案中所解释的,您不必太担心 receive_emails 字段。
  • 您不必将用户分为用户类型。

2中你担心的是依赖关系。依赖关系通常不是问题,但是您对基于 id 的数据库设计非常严格,从而对 dbms 隐藏了依赖关系。如果它知道,它可以帮助你:-)

你可以这样做:

  • 坚持你的表“users”,但删除company_id。
  • 您不必对“公司”、“套餐”、“参与”和“状态”进行任何更改。
  • 添加一个表将用户链接到公司。我们暂时将该表称为“从属关系”。(我不知道这是否是一个合适的名称,我的英语在这里失败了。)与所有权一样,这只是一个链接表,因此唯一的字段是 user_id 和 company_id (形成主键)。
  • 现在将 company_id 添加到“所有权”。(我知道,由于您链接到“包”,它隐式存在,但 dbms 不知道这一点。)因此添加该字段,现在您的 dbms 看到该字段,您还可以添加一个约束(外部约束)键)对 package_id 加 company_id 为“packages”,并对 user_id 加 company_id 约束为“affiliations”。

就是这样。您没有做太多改变,但现在一个用户可以隶属于许多公司(到目前为止是集团经理,但也许您决定有一天允许接收者与多家公司合作,或者让司机在同一家公司为多家公司工作)时间)。现在,“所有权”中不存在错误输入的风险,也不存在对其内容和使用有任何疑问的风险。

如果您想安全地使用 receive_emails 字段,您可能需要采用以下方法(正如我所说,这并不是真正必要的):创建一个新表 email_recipients,其中包含两个字段:user_id 和 user_type。是的,又是冗余。但是这样做,您可以对 user_type 进行限制,仅允许某些类型(到目前为止仅允许“收件人”)。同样,您不仅拥有 user_id 的外键,还拥有 user_id 和 user_type 的外键。