【发布时间】:2010-10-21 16:14:50
【问题描述】:
2009.04.24 更新
我的问题的重点不是开发人员的困惑以及如何解决它。
关键是要了解分隔值何时是正确的解决方案。
我见过商业产品数据库中使用的分隔数据(Ektron 哈哈)。
SQL Server 甚至具有 XML 数据类型,因此可以用于与分隔字段相同的目的。
/结束更新
我正在设计的应用程序有一些多对多的关系。过去,我经常使用关联表在数据库中表示这些。这给开发者带来了一些困惑。
这是一个示例数据库结构:
Document
---------------
ID (PK)
Title
CategoryIDs (varchar(4000))
Category
------------
ID (PK)
Title
Document 和 Category 之间存在多对多的关系。
在此实现中,Document.CategoryIDs 是一个大的以竖线分隔的 CategoryID 列表。
对我来说,这很糟糕,因为它需要在查询中使用子字符串匹配——这不能使用索引。我认为这会很慢并且不会扩展。
使用该模型,要获取某个类别的所有文档,您需要以下内容:
select * from documents where categoryids like '%|' + @targetCategoryId + '|%'
我的解决方案是创建一个关联表,如下所示:
Document_Category
-------------------------------
DocumentID (PK)
CategoryID (PK)
这让开发人员感到困惑。我是否缺少一些优雅的替代解决方案?
我假设 Document 中会有数千行。类别可能像 40 行左右。主要关注的是查询性能。我是否过度设计了这个?
是否存在优先将 ID 列表存储在数据库列中而不是将数据推送到关联表的情况?
还请考虑我们可能需要在文档之间创建多对多关系。这将建议一个关联表 Document_Document。这是首选设计还是将关联的文档 ID 存储在单个列中更好?
谢谢。
【问题讨论】:
-
我的公司广泛使用 CSV 列。这绝对是一场噩梦。太糟糕了,他们甚至已经意识到并停止这样做,但我们仍然必须支持遗留:(
-
我同意您的方法,但如果您不使用“ID”作为列名,它可能会有所帮助。 “DocumentID”和“CategoryID”更好,然后FK可以有相同的列名。
-
如果您从不需要在任何 SQL 语句中剖析列表,并且从不需要查询它们,那么分隔值可能是可以接受的。即便如此,使用关联表设计通常会更好。或者,就像我的回答一样,使用本地处理列表的 DBMS。
标签: sql database database-design architecture many-to-many