通过预定义的数据库列表实现完整性

时间:2014-03-25 11:52:45

标签: mysql sql database

为措辞严厉的问题道歉(一旦我弄清楚如何更好地定义这个问题,就会改变它。)

假设我在一个名为Supplier的数据库中有一个表。供应可以有vendor id作为PK,country。供应商必须使用一组三个预定义项目名称中的一个,而且只能处理一个项目。

捕获此数据的最佳方法是:

创建一个名为Project的表,其中Project ID为PK和“项目名称”字段。创建另一个名为SupplierProject的表,该表继承vendor idProject ID作为主键(或者是主键和备用键?)。

我这样想,如果项目名称曾经更新过,你只需更新Project表中的一个字段而不是项目名称的每个实例,如果在{{{{}}中创建了一个字段1}}表名为Supplier

应该注意的是,多家公司可能同时在同一个项目上工作,但他们需要成为“列表”中预先定义的项目之一。

这是否也会增加数据完整性无法输入不在列表中的内容?

在这种情况下,这是正常的事情,通过多对多关系结构创建Project Name吗?我很困惑,因为从技术上讲,供应商必须在一个项目上工作,而且任何时候都只需要一个项目。此结构为我提供了选择列表,但没有强制执行此规则。

希望这是有道理的,我并不完全忽视这一点。关于处理这些情况的最佳方法的任何建议都非常感谢!

1 个答案:

答案 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,但它实际上并没有进行检查。