当前位置: 首页 > 面试题库 >

多对多关系:在列中使用关联表还是带分隔符的值?

云星波
2023-03-14
问题内容

更新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列,该列允许您将数组存储在预定义的架构中,然后根据该字段的内容进行联接。其他数据库系统可能具有类似的功能。



 类似资料:
  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 “关联表”的正确或最受欢迎的名称是什么? 我听说过查找,关联,解析,映射和联结表。 问题答案: 对照表。CustomerProductXRef。

  • 问题内容: 我的数据库包含3个表:User和Service实体具有多对多关系,并与SERVICE_USER表联接在一起,如下所示: 用户-SERVICE_USER-服务 SERVICE_USER表包含附加的BLOCKED列。 执行这种映射的最佳方法是什么?这些是我的实体类 我遵循以下示例http://giannigar.wordpress.com/2009/09/04/m … using-jpa

  • 用户表结构:用户 id、名称、用户名、密码、创建时间、更新时间 文章表结构:文章 id、标题、内容、创建时间、更新时间 关系表:文章\用户 id、文章id、用户id处于活动状态、创建时间、更新时间 标签 id、名称、用户id、创建时间、更新时间 透视表项目用户与标记的关系。表:文章\用户\标签 标签号,物品号,用户号 我想连接这些表,以便可以像这样或类似的格式访问 并且应该能够创建/更新smth,

  • 问题内容: 我有一个使用联接表建模的一对多关系: 这些表应该模拟一个t1与多个t2的关系。使用JPA为这些表建模的正确方法是什么? 问题答案: 一个T1到多个T2的典型表是在T2上有一个指向T1的外键。通常不需要T1_T2表。 这样,JPA结构将是一对多的,可能是双向的。 可能会有一些安排,以使您描述的结构起作用。您可以更改T1_T2: 在T2上添加唯一约束(以便仅允许一个T2) 那真的是你想要的

  • 比如我们要关联用户和角色之间的关系,就要用到多对多。多对多需要一张中间表来做关联。 定义 多对多关联会用到的注解: @ManyToMany、@JoinFromMiddle、@JoinToMiddle、@AutoSelect、@AutoInsert、@AutoUpdate、@AutoSave、@AutoDelete 如 imi-demo 中代码所示,类定义了一个$userRole属性和$role属性