哪一个是更好的复合pk或在黑名单设计中使用自然键

时间:2012-11-30 18:13:58

标签: php mysql composite-primary-key

我将在php列表中设计我的黑名单和收藏夹哪个用户可以黑名单并且喜欢其他人,现在我只想知道这样设计更好

+-----+------+------------+
| uid(pk) | name | family |
+-----+------+------------+

和另一个这样的表是复合主键

+-----+------+------------------------+
| uid(pk) | blacklisted_person_id(pk) |
+-----+------+------------------------+

或设有主键和外键的设计,我不知道如何设计在这种情况下,用户不能将自己列入黑名单或将某人列入黑名单2次。如果有人可以形容它有点不适感激。 提前谢谢

2 个答案:

答案 0 :(得分:1)

您的解决方案很好,但我建议您只在id而不是uid的用户表中调用您的PK,然后在您的映射黑名单表中将其称为user_id( if user是用户表的名称)和blacklisted_user_id。这样,这些单独的列是外键的表格没有歧义。

它是一个很好的解决方案的原因是它可以防止输入重复项而无需创建额外的唯一复合键。

答案 1 :(得分:1)

我认为你在标题中使用的术语令人困惑,而且与你在问题后面描述的内容不符。

  1. 始终使用人工键并尽量避免使用自然键。这是一个很好的做法,因为你几乎不知道以后哪些数据可能会被改变,这可能会影响你的自然键。
  2. | uid(pk) | name | family |

    上述设计是一个良好的开端。

    1. 尽可能少地限制数据模型而不牺牲数据一致性。
    2. 在这种情况下,UID, black_listed_ID的复合键可能有点过于严格,其原因是稍后您可能决定在不同时间保留谁列出黑名单的日志,然后是您的复合键设计休息。

      现在只使用简单的一对多关系,描述一个用户对多个记录的偏好。

      例如,可以包含黑名单,白名单等用户操作的数据模型可以是这样的:

      UID, AFFECTED_USER_ID, ACTION_ID, ACTION_DT

      其中ACTION_ID是FK到描述黑名单,white_listing,灰名单等的“ACTION查找表”。

      您还可以拥有描述当前事态的表格,但也可以从上述数据中计算或检索当前状态。