为措辞严厉的问题道歉(一旦我弄清楚如何更好地定义这个问题,就会改变它。)
假设我在一个名为Supplier
的数据库中有一个表。供应可以有vendor id
作为PK,country
。供应商必须使用一组三个预定义项目名称中的一个,而且只能处理一个项目。
捕获此数据的最佳方法是:
创建一个名为Project
的表,其中Project ID
为PK和“项目名称”字段。创建另一个名为SupplierProject
的表,该表继承vendor id
和Project ID
作为主键(或者是主键和备用键?)。
我这样想,如果项目名称曾经更新过,你只需更新Project
表中的一个字段而不是项目名称的每个实例,如果在{{{{}}中创建了一个字段1}}表名为Supplier
。
应该注意的是,多家公司可能同时在同一个项目上工作,但他们需要成为“列表”中预先定义的项目之一。
这是否也会增加数据完整性无法输入不在列表中的内容?
在这种情况下,这是正常的事情,通过多对多关系结构创建Project Name
吗?我很困惑,因为从技术上讲,供应商必须在一个项目上工作,而且任何时候都只需要一个项目。此结构为我提供了选择列表,但没有强制执行此规则。
希望这是有道理的,我并不完全忽视这一点。关于处理这些情况的最佳方法的任何建议都非常感谢!
答案 0 :(得分:1)
在MySQL中,您需要一个包含允许项目列表的Projects
表。
在Suppliers
表中,您需要项目ID和外键引用。
这样的事情:
create table Projects (
ProjectId int not null auto_increment primary key,
ProjectName varchar(255) unique
);
create table Suppliers (
SupplierId int not null auto_increment primary key,
. . .
ProjectId int not null,
. . .
foreign key ProjectId references Projects(ProjectId)
);
然后使用您允许的值填充Projects
。然后,每个供应商必须引用其中一个有效值(not null
需要参考)。
在其他数据库中,您只需check constraint
表中的Suppliers
即可完成此操作。 MySQL允许您编写check constraint
,但它实际上并没有进行检查。