【问题标题】:Multiple ID's in a field. Postgresql一个字段中有多个 ID。 PostgreSQL
【发布时间】:2013-09-13 02:44:55
【问题描述】:

所以,我目前正在使用一个数据库系统,用户可以随时注册、登录和更新他/她的详细信息。 该数据库包括 5 个角色:

1. Public
2. Member
3. Moderator
4. Coordinator
5. Admin

我希望能够为我的用户分配多个角色。例如,管理员也可以是成员。因此在数据库中应该显示:

User_id    |    Role_ID
------------------------
user1      | 2, 5

^ 是否可以在 postgresql 中添加多值 id?

【问题讨论】:

    标签: postgresql multivalue


    【解决方案1】:

    您可以使用数组类型的字段来存储值列表。 但是我认为有更好的方法来组织你想要的东西。

    制作一个表:role_names和另一个roles,像这样:

    CREATE TABLE role_names
    (
      id serial NOT NULL,
      name text NOT NULL,
      CONSTRAINT role_names_pkey PRIMARY KEY (id),
      CONSTRAINT role_names_name_key UNIQUE (name)
    );
    
    CREATE TABLE roles
    (
      user_id bigint NOT NULL,
      role_id bigint NOT NULL,
      CONSTRAINT roles_pkey PRIMARY KEY (user_id, role_id),
      CONSTRAINT roles_role_id_fkey FOREIGN KEY (role_id)
          REFERENCES role_names (id) MATCH SIMPLE
          ON UPDATE CASCADE ON DELETE RESTRICT
    );
    

    现在,在 role_names 表中,您输入了您想要拥有的所有角色。 在表角色中,您可以为任何用户分配或删除任意数量的角色。 您还可以在 roles 表中搜索特定用户或特定角色 - 我认为比搜索数组更简洁、更快捷。

    也可以随意为 user_id 字段添加 FK 约束。

    【讨论】:

    • 这也有效,两个答案都试一试,它们都有效。非常感谢
    【解决方案2】:

    是的,您可以使用 int array 来存储角色列表。

    这是相关问题 -Junction tables vs foreign key arrays?

    【讨论】:

    • 如果整数是外键并且它引用了设置 ID 的角色表怎么办。因为我尝试做 role_id int[] 引用角色;那没有用
    • 键列“role_id”和“id”的类型不兼容:integer[]和integer。
    • 据我所知,您不能为数组元素创建外键。你可以通过触发器来做到这一点,或者使用表 user_id、role_id 来存储多个角色
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多