使用传递关系规范化架构

织造

我需要创建三个这样的模型:

Company
* name ...

Order
* amount ...

OrderGroup
* description ...

订单始终属于公司,即使它不属于任何组。即使没有订单,组也始终属于公司。

  • 订单属于0或1组。
  • 一个组由0到n个订单组成。
  • 组属于公司,因此其组中的所有订单也必须属于同一公司。

如何为此创建架构?

如果我仅将Company_id和group_id添加到Order,则数据库不知道它们已连接,并且我的应用程序可能会引入不一致之处:

Order 1, company1, group1
Order 2, company2, group1 #should not be possible

如果我将company_id添加到Group而不是Order,则不属于任何Group的Order会出现问题:

Order 1, Group=null #don't know the company

我可能必须将这两个连接的字段提取到一个单独的表中,但是我不确定它应该具有哪些约束。

费城

查询不需要约束(包括候选键,外键和基数)。它们反映了对基表和查询结果的可能值的限制。我们将有关约束的信息告知DBMS,以防止出现不可能的情况。外键不会为了查询目的而“连接”表。任何两个表都可以有意义地连接。

假设每个订单和组都有一个公司,并且ORDER和GROUP(标识)是UNIQUE,那么简单的设计是:

Company -- company COMPANY has name NAME ...
    PRIMARY KEY (COMPANY)
Order -- company COMPANY's order ORDER is for amount AMOUNT ...
    PRIMARY KEY (ORDER)
    FOREIGN KEY (COMPANY) REFERENCES Company (COMPANY)
OrderGroup -- company COMPANY's order group GROUP has description DESCRIPTION ...
    PRIMARY KEY (GROUP)
    FOREIGN KEY (COMPANY) REFERENCES Company (COMPANY)
Contains -- order group GROUP contains order ORDER
    PRIMARY KEY (GROUP, ORDER)
    FOREIGN KEY (GROUP) REFERENCES Company (GROUP)
    FOREIGN KEY (ORDER) REFERENCES Order (ORDER)

关系外键约束表示,表的子行中的值列表必须作为候选键的表的子行中的值列表出现在其他位置。(SQL FOREIGN KEY约束引用一个超键:UNIQUE NOT NULL或PRIMARY KEY。)

在该设计中,当一个小组包含一个订单时,我们不能声明性地约束该小组和一个订单以拥有一个共同的公司。但是,如果我们改用设计来为组和订单提及同一家公司,那么我们可以声明性地约束:

Contains -- for company COMPANY order group GROUP contains order ORDER
    FOREIGN KEY (COMPANY, GROUP) REFERENCES OrderGroup (COMPANY, GROUP)
    FOREIGN KEY (COMPANY, ORDER) REFERENCES Order (COMPANY, ORDER)
-- add to Orders
    UNIQUE NOT NULL (COMPANY, ORDER)
-- add to OrderGroup
    UNIQUE NOT NULL (COMPANY, GROUP)

(这是SQL的一种古怪,您必须将引用的列列表声明为UNIQUE / PK,即使每个列表都包含一个较小的声明的UNIQUE / PK列列表,这意味着包含列表必须是UNIQUE / PK。)

附注:以上内容是在您编辑每个订单的一组上限之前编写的。如果一个订单最多可以出现在一组中,则包含PK(ORDER)。由于订单最多只能出现一次,因此只能出现在一组中。(或者,您可以进行设计,在其中删除Contains并向订单添加可空NULL的GROUP,并在组中添加FK(COMPANY,GROUP)。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

规范化数据库架构

来自分类Dev

数据库架构规范化

来自分类Dev

实体关系模型/关系模型和属性规范化

来自分类Dev

在Scrapy中使用规范化空间

来自分类Dev

使用Redux存储规范化数据

来自分类Dev

使用WCF更改规范化算法

来自分类Dev

有关关系的规范化问题

来自分类Dev

在MySQL中反规范化多对多关系

来自分类Dev

规范化理解

来自分类Dev

在wsgi环境中使用Unipath进行规范化不会产生规范化的答案

来自分类Dev

使用自定义规范化和规范化支持

来自分类Dev

Stanford TokensRegex:如何使用NER注释的规范化输出设置规范化注释?

来自分类Dev

用户数据库架构-是否规范化?

来自分类Dev

SQL Server - 编写查询,在结构不佳的架构中规范化逗号分隔值

来自分类Dev

Swift字符串比较使用哪种规范化?

来自分类Dev

使用nio.relativize作为规范化路径

来自分类Dev

如何使用jQuery规范化非jQuery事件

来自分类Dev

如何使用ServiceStack获取非规范化的对象数组

来自分类Dev

如何使用非规范化的数据保持代码干净?

来自分类Dev

使用ember数据规范化嵌入式记录

来自分类Dev

Tsql使用文本值对表进行非规范化

来自分类Dev

在.NET中使用RegEx规范化Windows路径或URI

来自分类Dev

R使用max规范化数据框列

来自分类Dev

非规范化字段的性能与单独收集的使用

来自分类Dev

如何使用重复值规范化MySQL表

来自分类Dev

使用多个实体规范化CSV数据

来自分类Dev

使用带有JSON规范化的熊猫

来自分类Dev

我的代码中使用了哪种规范化?

来自分类Dev

使用Firebase,AngularFire提取非规范化数据