在“产品销售”数据库中,客户的订单可能包含一个或多个产品;产品可以出现在许多订单中。在“书店”数据库中,一本书是由一个或多个作者撰写的;而作者可能写零本书或更多本书。这种关系被称为多对多。
让我们用“产品销售”数据库进行说明。我们从两个表开始:产品和订单。表格产品包含有关产品的信息(例如名称,说明和quantageInStock),其中产品ID为主键。表订单包含客户的订单(customerID,dateOrdered,dateRequired和状态)。同样,我们无法将订购的项目存储在Orders表中,因为我们不知道要为项目保留多少列。我们也无法将订单信息存储在“产品”表中。
为了支持多对多关系,我们需要创建第三个表(称为联结表),例如OrderDetails(或OrderLines),其中每行代表一个特定订单的项目。对于OrderDetails表,主键由两列组成:orderID和productID,它们唯一地标识每一行。OrderDetails表中的orderID和productID列用于引用Orders和Products表,因此,它们也是OrderDetails表中的外键。
实际上,通过引入联结表,多对多关系被实现为两个一对多关系。
订单在OrderDetails中有很多项目。OrderDetails项目属于一个特定订单。
产品可能会出现在许多OrderDetails中。每个OrderDetails项目都指定一个产品。