【问题标题】:SQL multiplicity many to many insertion processSQL 多重性多对多插入过程
【发布时间】:2016-02-17 14:26:06
【问题描述】:

我的问题似乎很简单,但不幸的是我找不到任何令人满意的答案。

请看下面的例子:

Author 定义一个作者,Document 至少有一个作者,表Authors 分组一个文档的所有作者。

我的问题是:每次插入文档时,我都需要验证我的作者组是否已经存在于表 Authors 中。

最好的方法是什么? 我想首先我需要验证该组是否已经存在,然后,我应该获取该 ID(如果已经存在)或在 Authors 上生成一条新记录(如果该组不存在)。

问题:

这是否应该在具有多对多多重性的表上发生的正确逻辑过程?

如何检查 Authors 表中是否已经存在一组值?

有类似select * from Authors where a_id IN(1,2,3) 的东西,但是以一种独特的方式。 :S

任何帮助都会很棒。

谢谢

【问题讨论】:

    标签: sql data-modeling multiplicity


    【解决方案1】:

    我宁愿使用三个表的解决方案:

    Author
    Document
    rel_author_document
    

    rel_author_document 的结构如下:

    author_fk
    document_fk
    

    您无需添加新组,只需将作者与文档关联即可。

    如果您需要类似的内容,您甚至可以在 rel_author_document 中添加额外的列,例如 role

    使用这种方法,您可以拥有具有同一组作者的两个文档,但这不会影响您的表现。

    如果您的问题是关于家庭作业并且您无法更改表格结构:

    1. 查询Authors表,看看在where条件下是否有一组Author_id相同的Author,比如:

      选择计数(1) cnt 来自作者 其中 a_id IN(1,2,3)

    2. 如果cntauthor_id的数量不同,则插入一个新组

    3. 如果cnt 相等,则获取该组作者的ID:

        select ID 
          from Authors 
         where a_id = 1
            or a_id = 2
            or a_id = 3   
      group by 1
        having count(1) = 3
      

    【讨论】:

    • 是的,Authors 已经是第三个表了,所以建议你修改这个表,让它有一个文档外键。好的,但这样我就会有作者记录*文档记录。我在考虑如何拥有作者组并将它们与文档相关联(如果它已经存在)。可能不是一个好的做法,因为我必须检查该组作者是否已经存在。
    • 为一组作者设置一个 ID 的一个原因是,如果您有这么多组以致于您的查询变慢,那么您可能永远不需要它以及避免重复组的逻辑是“复杂的”,在这一点上不值得。最好每次为每个编写的过度复杂代码的文档复制 author_id
    【解决方案2】:

    如果它是“多对多”关系,我相信您正在寻找的表结构是:

    作者 ( 援助, 姓名, 出生日期, 域)

    文档 ( 做过, 抽象的, 年)

    Auth_Doc ( 援助, 做过 )

    就检查是否已经有一组作者而言,这取决于您如何显示数据。如果我正在上传一个文档并且我想检查一组作者是否存在,我会执行以下操作:

    假设您的数据存储为:

    a_id |名字

    1 |约翰,杰克,鲍勃

    SELECT * FROM Author WHERE name like '%john%'
    

    希望对你有帮助,

    苏海尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多