在数据库设计中使用唯一键作为外键是否很好?

时间:2016-03-12 18:48:56

标签: database postgresql database-design primary-key unique-key

我正在创建用户管理数据库架构。我使用Postgresql作为数据库。以下是我的方法。如果我使用此结构,请建议是否存在任何性能问题。

要求

  • 将来期待数百万用户。
  • 我也必须在其他系统上使用唯一的用户ID,可能在MongoDB,redis等上。

方法

  • 我使用pseudo_encrypt()作为唯一的user_id(BIGINT或BIGSERIAL),因此没有人可以猜出其他ID。例如:3898573529235304961
  • 在另一个表中使用user_id作为外键。我没有使用用户表的主键作为外键。

sample user table & publisher table schema

有什么建议吗?

  1. 在其他表格中使用唯一键作为外键,我这样做是否正确?
  2. CRUD操作期间的任何性能问题&复杂的连接?
  3. 在任何其他数据库中使用唯一键是正确的方法吗? (在分布式环境的情况下)

1 个答案:

答案 0 :(得分:0)

在自然与代理主键的问题上,你正在涉及火焰战争领域。我同意你的观点并经常使用唯一键作为外键,并指定自然主键。在PostgreSQL上这是安全的(在MySQL或MS SQL上,这将是一个坏习惯)。

在PostgreSQL中,主键和唯一约束之间的唯一区别是:

  1. 一个表只能有一个主键
  2. 所有列上的主键都不为空
  3. 实际上,如果您将表定义为NOT NULL UNIQUE,则它与单个主键大致相同。

    在其他dbs上,表格结构经常针对主键查找进行优化,这就是为什么这是一个问题,并且可能有一些工具不喜欢它,但这些都是db设计本身以外的问题。< / p>

    你最好使用普通的连续剧并拥有真正的访问控制,而不是试图在默默无闻中构建东西。默默无闻的控制可能会表现得更糟,但不如仅仅做正确的事情那么安全。