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 存储在单个列中更好?
谢谢。