更新2009.04.24
我的问题的重点不是开发人员的困惑以及如何处理。
关键是要了解定界值何时是正确的解决方案。
我已经看到了商业产品数据库(Ektron哈哈)中使用的定界数据。
SQL Server甚至具有XML数据类型,因此可以与定界字段用于相同的目的。
/结束更新
我正在设计的应用程序具有一些多对多的关系。过去,我经常使用关联表在数据库中表示这些表。这给开发人员造成了一些混乱。
这是一个示例数据库结构:
Document --------------- ID (PK) Title CategoryIDs (varchar(4000)) Category ------------ ID (PK) Title
文档和类别之间存在多对多关系。
在此实现中,Document.CategoryIDs是大的用竖线分隔的CategoryID列表。
对我而言,这很糟糕,因为它需要在查询中使用子字符串匹配-无法使用索引。我认为这将很慢并且不会扩展。
使用该模型,要获取某个类别的所有文档,您将需要以下内容:
select * from documents where categoryids like '%|' + @targetCategoryId + '|%'
我的解决方案是创建一个关联表,如下所示:
Document_Category ------------------------------- DocumentID (PK) CategoryID (PK)
这使开发人员感到困惑。我缺少一些优雅的替代解决方案吗?
我假设文档中将有数千行。类别可能像40行左右。主要关注的是查询性能。我是在过度设计吗?
是否有一种情况是,最好将ID列表存储在数据库列中,而不是将数据推送到关联表中?
还考虑我们可能需要在文档之间创建多对多关系。这将建议一个关联表Document_Document。是首选设计还是将相关文档ID存储在单个列中更好?
谢谢。
设计中的Document_Category表无疑是解决问题的正确方法。如果可能的话,我建议您对开发人员进行教育,而不要提出次优的解决方案(并导致性能下降,并且没有参照完整性)。
您的其他选项可能取决于您使用的数据库。例如,在SQL Server中,您可以有一个XML列,该列允许您将数组存储在预定义的架构中,然后根据该字段的内容进行联接。其他数据库系统可能具有类似的功能。