1

我将在 php 列表中设计我的黑名单和收藏夹,用户可以将其列入黑名单和收藏其他人,现在我只想知道这样设计是否更好

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

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

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

或在其中包含主键和外键的设计,在这种情况下我不知道如何设计用户不能将自己列入黑名单或将某人列入黑名单 2 次。如果有人能描述一下,我将不胜感激。提前致谢

4

2 回答 2

1

您的解决方案很好,但我建议您只在您的用户表中调用您的 PK,id然后uid在您的映射黑名单表中将其称为user_id(如果用户是用户表的名称)和blacklisted_user_id. 这样一来,这些单独的列是哪个表的外键就没有歧义了。

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

于 2012-11-30T18:16:56.283 回答
1

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

  1. 始终使用人工键并尽量避免使用自然键。这是一个很好的做法,因为您几乎永远不知道以后必须更改哪些数据,这可能会影响您的自然密钥。

| uid(pk) | name | family |

上面的设计是一个好的开始。

  1. 在不牺牲数据一致性的情况下,尽可能少地限制数据模型。

在这种情况下,复合键的UID, black_listed_ID限制可能有点过于严格,原因是稍后您可能决定保留谁在不同时间将谁列入黑名单的日志,那么您的复合键设计就会中断。

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

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

UID, AFFECTED_USER_ID, ACTION_ID, ACTION_DT

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

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

于 2012-11-30T18:33:40.900 回答