【发布时间】:2012-05-20 15:26:29
【问题描述】:
我只需要确认一下这样设计的数据库是否正常。如果不是我在这里做错了什么。
我有以下表格:
TableA{TableAID,...}
TableB{TableBID,...}
TableC{TableCID,...}
etc.
我有一张桌子,我用它就像某种“新闻提要”。当我在任何表 A、B、C 中添加内容时,我也会在此表中添加行。
Feed{FeedID, TypeID, ReferenceID,...}
FeedID 是 PK 自动增量TypeID 是引用类型表的数字,基于此 ID,我知道此表中的行来自表 A、B、C。ReferenceId 是 ID表 A、B、C 中的项目。
A、B、C 表都有不同的字段。
现在,当我想获取提要数据时,我还需要从每个表中获取一些数据以在应用程序中使用它。在我的查询中,我使用了很多 SELECT CASE CLAUSE 之类的:
我首先加入查询中的所有表 (A,B,C)
...
CASE Feed.TypeId
WHEN 1 THEN tableA.someData
WHEN 2 THEN tableB.someData
WHEN 3 THEN tableC.someData
END AS Data,
...
【问题讨论】:
-
1:1 扩展表可用于相当复杂的查询。我更喜欢一张桌子。为与每种 Feed 类型不相关的属性提供可为空的列。
-
为什么A、B、C是分开的表?为什么不拥有一个具有类型属性的表,而不是抽象它并使模型复杂化?如果您必须编写涉及基于表的附加列的查询,则这些查询可能会因涉及基于类型的附加列而同样复杂。换句话说,正如@Andomar 所建议的那样,所有可能的列都将在另一个表中,并且有些列可以根据类型为空。
-
因为它们是独立的实体 A 可以有 10 列,B 可以有 3 列,C 可以有 5。
标签: sql-server database tsql database-design relational-database