【问题标题】:Updating in a many-to-many relationship在多对多关系中更新
【发布时间】:2012-02-17 20:13:44
【问题描述】:

我有一个多对多表,其中存储了用户可以拥有的每个允许角色的记录。如果用户更新他的角色(添加和删除)角色,我应该如何处理?

我应该先删除所有用户角色,然后添加选定的角色吗?或者进行某种匹配?

【问题讨论】:

  • 这就是我们有参数的原因,您将 userID 和 roleID 作为参数传递,然后执行:DELETE FROM MyTable WHERE userID = @UserID AND roleID = @RoleID
  • 这实际上是一个比表面上看起来更好的问题。如果您的 UI 允许您编辑表格的多面并在用户点击保存时以批处理模式更新它(而不是一次执行一个),那么另一个用户可能会修改您下方的表格,这样您就可以'不确定,例如,当当前用户在 UI 中编辑时,另一个用户是否添加了角色

标签: sql-server many-to-many


【解决方案1】:

给这只猫剥皮的方法有很多,我能想到的几个技巧:

1.删除所有角色并重新插入
这是一种直截了当的方法。删除用户的所有角色,然后重新插入。通常用户只属于少数几个角色(少于 10 个)。此外,很有可能没有其他外键链接到这个多对多表。

2。跟踪更改并仅应用更改
这是更多的工作,但更有效,即使在这种情况下只是轻微的。 ORMs 之类的工具让跟踪和应用这些类型的更改变得轻而易举。

3.在用户进行更改时应用更改
在这种情况下,我假设在最终用户将用户与角色相关联时应用数据库更改是可以接受的。也许它是一个本地数据库,每个事务都是短暂的。但我想这不太可能发生。

我认为删除并重新插入这种特殊情况没有任何问题。

【讨论】:

    【解决方案2】:

    如果一个人删除了一个角色,为什么不通过userIDroleID 并删除那条记录? 为什么要删除特定 userID 的所有角色 ID,然后再次读取它们?

    根据我上面的评论,传递两个参数: UserIDRoleID

    然后您可以删除/提取该单个元组。

    【讨论】:

    • 用户界面的设置方式通过复选框设置角色,您可以在其中选中或取消选中多个
    • @chobo - 所以发送多个参数,您可以使用IN 等。无论哪种方式,如果没有太多角色,您可以简单地删除所有角色并只读选中的角色。
    猜你喜欢
    • 2021-04-11
    • 2017-01-30
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多