也许实现这种设计最常见的方式是用你提到的“每个所有者类型一个表”方案(表格图像,“所有者A”,“所有者A图像”,并且为所有者B,C,等等)。另一种常见的实现方式是使用一个“中心”表格来存储图片,单个所有者的ID存储在该表格中。您的标准尤其受到限制,因为图像可能与一个且只有一个所有者相关联,但拥有多种类型的所有者。在数据库中实现这样的约束是非常棘手的,但是在数据库之外实现这些约束要困难得多,并且出现所有常见原因(数据库的应用程序工作,以及有人在专用应用程序之外修改数据库时会发生什么?)
以下是如何在数据库中实现这些结构和约束的示例。它可能看起来很挑剔,细节和过于复杂,但它会完成这项工作,一旦正确实施,您就不必担心数据是否一致和有效。
首先,所有图像都存储在下表中。必须知道图像可能分配给哪个所有者的“类型”;在ImageType中设置,并且(根据后面表格中的约束)图像不能被分配给任何其他类型的所有者。永远。 (你也可以把一个CHECK约束将ImageType上,以确保只有合法的图像类型可以在表中加载。)
CREATE TABLE Image
(
ImageId int not null
,ImageType char(1) not null
,constraint PK_Image
primary key clustered (ImageId, ImageType)
)
下,建立一些店主的表。你可以有任何数量的这些,为了这个例子我只做了两个。
CREATE TABLE A
(
AId int not null
constraint PK_A
primary key clustered
)
CREATE TABLE B
(
BId int not null
constraint PK_B
primary key clustered
)
构建关联表,注意约束定义旁边的注释。 (这是过于繁琐部分...)
负载一些示例数据
插入图像值(1, 'A')
INSERT Image values (2, 'A')
INSERT Image values (3, 'B')
INSERT Image values (4, 'B')
INSERT A values (101)
INSERT A values (102)
INSERT B values (201)
INSERT B values (102)
视图的当前内容表:
SELECT * from A
SELECT * from B
SELECT * from Image
SELECT * from Image_A
SELECT * from Image_B
,并做一些测试:
-- Proper fit
INSERT Image_A (ImageId, AId) values (1, 101)
-- Run it again, can only assign once
-- Cannot assign the same image to a second owner of the proper type
INSERT Image_A (ImageId, AId) values (1, 102)
-- Can't assign image to an invalid owner type
INSERT Image_B (ImageId, BId) values (1, 201)
-- Owner can be assigned multiple images
INSERT Image_A (ImageId, AId) values (2, 101)
(此丢弃该测试表)
drop table Image
drop table A
drop table B
drop table Image_A
drop table Image_B
(Techincally,这是在独特的类型/子类型的数据建模 “问题” 的变体的一个很好的例子。)
您可以创建一个带有诸如File-Url等字段的Images表。然后,Image-Contents表将与Images表中的一行具有一对一的关系。 – Pace 2010-07-01 13:47:44
只是要清楚。设计可能是: 目录 - >图像内容 - >图像 类别 - >图像 - 类别 - >图像 作者 - >图像作者 - >图像 模式是: 一对一-many - >链接表 - >一对一 正确吗? – GibboK 2010-07-01 14:03:54
这之前已经问过:http://stackoverflow.com/questions/3150557/separate-link-association-tables-for-different-data就我个人而言,我喜欢OO超类型方法。 – BenV 2010-07-06 16:55:10