【发布时间】:2016-09-29 01:25:03
【问题描述】:
我正在为一个应用程序建立一个朋友列表,我想知道是否可以以不允许键的反向组合的方式定义表上的键/索引。
例如,假设表格有如下列:
user_id1, user_id2, status, [..timestamps]
主键是user_id1和user_id2组成的组合键。到目前为止没有什么特别的。您可能会存储类似这样的数据:
+----------+-----------+----------+---------------------+---------------------+
| user_id1 | user_id2 | status | created_at | updated_at |
+----------+-----------+----------+---------------------+---------------------+
| 3 | 1 | 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | 3 | 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----------+-----------+----------+---------------------+---------------------+
但是这样就没有约束会拒绝您分别为user_id1 和user_id2 插入1, 3 或3, 2 - 就像这样:
+----------+-----------+----------+---------------------+---------------------+
| user_id1 | user_id2 | status | created_at | updated_at |
+----------+-----------+----------+---------------------+---------------------+
| 3 | 1 | 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | 3 | 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 1 | 3 | 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 3 | 2 | 1 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----------+-----------+----------+---------------------+---------------------+
在这种情况下,用户 1 或用户 2 并不重要,重要的是链接与否。重复不一定会破坏代码,但在 MySQL 中执行规则也会很好。
【问题讨论】:
-
请用清晰的语言表达您的要求。几乎看不出来。
-
我在这里挥舞危险的红旗。你可以看到我吗?每当您在同一个表中有两个或多个列的值来自同一个信息域时,您(可以说)违反了关系模型,并且(可以说)为自己设置了您将讨厌的查询,更快或更高版本。
-
@Michael-sqlbot 我有一种感觉。你能推荐一个替代结构吗?
-
有些事情最好在应用程序中完成,而不是 SQL。
标签: mysql database-design constraints primary-key ddl