我需要创建三个这样的模型:
Company
* name ...
Order
* amount ...
OrderGroup
* description ...
订单始终属于公司,即使它不属于任何组。即使没有订单,组也始终属于公司。
如何为此创建架构?
如果我仅将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] 删除。
我来说两句