我正在为学校设计一个文档管理系统(SQL&amp; .NET)。学校有各种各样的数据,如人员,学生,财务等。系统应该能够将文件附加到系统中的任何记录,无论其类型(人员,学生......)< / p>
这样做的典型ER方法是创建tye不同类型的表(人员......)以及Documents表。要将类型表记录与文档记录相关联,需要一个“链接表”,例如PersonnelDocuments,其中包含PersonnelID和DocumentID列。
我发现这种方法有点笨拙,因为可能有100个类型表(在未来的系统中)每个人都需要一个链接表。是否有更通用的方法,同时仍然遵循正确的ER DB设计。
答案 0 :(得分:1)
一种解决方案是使您的唯一标识符如此之大,以至于数据库中的每个对象都具有唯一标识符,而不管它所在的表(GUID通常就是这样)。为每个对象提供唯一标识符后,只需要一个链接表。我已经将这种方法用于一个应用程序,它要求你能够对数据库中的任何对象发表评论,就像你一样,我发现有几十个名为XXXXComments和YYYYComments的表都不会削减它。这个解决方案很好地清理了一切。
编辑: 我过去使用的另一种方法是使所有需要文档链接的表派生自同一个基表。这种方法本身通常非常笨重,但除非您的域名相当小,或者需要文档链接的部分是自包含的。如果我没记错的话,我正在创建一个报告跟踪应用程序,其中所有报告都有很多类型,每个报告都可以转发到公司的不同组,然后返回并转发给其他组,直到获取所有必需的项目为止。处理。我最终创建了一个报告基表,我的转发链接表使用了Id而不是为每种类型的报告创建转发表。
答案 1 :(得分:0)
您将系统描述为文档管理系统。然后,一种解决方案是尊重系统中实体的记录性质的首要地位。以下模型定义了一个抽象实体,它充当文档表的父节点,并充当一堆子类型表的超类型。此模型允许您将任意数量的文档与DocumentedThing
。
DocumentedThing
---------------
ThingId Integer primary key
ThingType String check (ThingType in ('PUPIL', 'STAFF'))
unique key (ThingId, ThingType)
Document
--------
ThingId Integer foreign key references DocumentedThing (ThingId)
DocumentId Integer primary key
Text Clob
Pupil
-----
PupilId Integer primary key
ThingId Integer unique key
ThingType String check (ThingType = 'PUPIL')
Name String
DateOfBirth Date
foreign key (ThingId, ThingType)
references DocumentedThing (ThingId, ThingType)
Staff
-----
StaffId Integer primary key
ThingId Integer unique key
ThingType String check (ThingType = 'STAFF')
Name String
HireDate Date
foreign key (ThingId, ThingType)
references DocumentedThing (ThingId, ThingType)
唯一键的搭建确保DocumentedThing
可以在Staff
或Pupil
中创建记录,但不能同时记录两者。此外,在任何子类型表中都不能有多个记录。 Staff
中的记录只能映射到DocumentedThing
中ThingType
中值为“STAFF”的记录。难以强制执行的一件事是坚持DocumentedThing
必须具有子类型记录。它可以完成,但通常很复杂,在某种程度上取决于您选择的DBMS产品。
添加新的子类型影响最小:除了添加实际表来保存其信息之外,您只需要向DocumentedThing.ThingType
添加新值;如果您有很多子类型,您可以选择使用外键将其限制为查找表而不是检查约束。