【问题标题】:MySQL Share user_id with users table and admins tableMySQL 与 users 表和 admins 表共享 user_id
【发布时间】:2012-02-03 13:10:43
【问题描述】:

我正在为 cmets 创建一个表,其中一个字段是 user_id。好吧,普通用户和管理员都可以发表评论,所以我不知道该怎么做。


Users 表的主键为user_id

Admins 表的主键为admin_id


那我该怎么做呢?

【问题讨论】:

    标签: mysql sql database-design primary-key


    【解决方案1】:

    如果您可以重新设计一个带有 isAdmin 标志的表 (login?),我会这样做。


    如果你不能,那么有一个过程会导致 admin 表中的每个条目在 user 表中创建一个相关条目。然后,admin 表可以有一个 user_id 字段来将两者关联起来。

    这样每个管理员都有一个用户,所有的cmets都可以使用这个user_id。


    我会强烈避免让 cmets 对 both user_id 和 admin_id 进行键控,其中一个保持为 NULL。如果您在其他任何地方遇到类似的需求,它会使查询变得凌乱,阻碍您执行约束,并将您与凌乱的两键方法联系起来。

    【讨论】:

    • 唯一的问题是我只需要管理员的用户名、密码、名字和姓氏。 users 表有一堆字段不适用于管理员。无论如何我都可以输入它们并将其他字段保留为 NULL,但用户表没有管理员需要的名字和姓氏列。所以它只是两种不同的设计
    • 在用户没有管理员拥有的字段的情况下,这不是问题。您仍然拥有原始管理员记录,您将管理员数据保存在 admin 表中。相反的方式也应该是可以管理的,继续像以前一样使用管理表。这只是为每个管理员建立一个 user_id 以便他们可以离开 cmets 并且表只需要使用一个外键。
    【解决方案2】:

    为什么不在一个表中包含所有用户和管理员并有一列“isAdmin” - 如果用户是管理员设置为 1,则默认为 0

    您的 cmets 表应该有两列,并且更新了 user_id 或 admin_id,默认为 0 - 但这不是一个好方法...

    【讨论】:

    • 我可以这样做,但普通用户拥有的 90% 的字段,管理员不需要 - 管理员只需要用户名和密码。
    • 这更建议我不要为管理员设置单独的表格 - 空间和速度的腰部......但我想这取决于你。然后尝试第二种解决方案。
    【解决方案3】:

    您可以通过几种不同的方式完成此操作。要么有一个 commenter_id 链接到 user_id 或带有关联 user_type 标志的 admin_id 要么有两个 commenter_id 字段,一个用于用户,一个用于管理员,并且关闭哪个字段的值来确定要为任何相关的表转到哪个表查询。我敢肯定还有其他更优雅的选择,但这两个是快速和肮脏的选择。

    【讨论】:

      【解决方案4】:

      那么就可以将table -cmets设为

      comment_id-int
      user_id-fk from users table or admin table
      user_type- enum('admin','user')
      comment
      

      //及其他必填字段

      【讨论】:

      • 您不能将外键指向两个单独的表。您可以拥有一个“您知道”以这种方式运行的字段,但是您不能以这种方式强制执行约束。
      • 我的意思是外键,它指的是表中的任何一个。表示 user_id 可以来自 users_table 或 admin_table。列可以有一对多的关系。
      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2021-04-16
      • 2023-03-28
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多