【发布时间】:2012-01-16 07:03:56
【问题描述】:
为了解释的简单起见,想象一个房间里挤满了互相交谈的人。一个人对另一个人的每一句话都会成为这张表中的一条记录,所有这些记录都有一个通过自增分配的唯一ID。
但是,并不是这个房间里的每个人都在和其他人交谈。有多个对话正在进行。
这些对话彼此之间必须是独一无二的。这将防止重复的对话 ID 被启动,并且该网站会收集不属于该人的所有陈述。
或者,以图形表示:
----------------------------------------------
| MessageID | ConvoID | Sender | Recipients | etc...
----------------------------------------------
| 1 | 1 | A | B |
----------------------------------------------
| 2 | 1 | B | A |
----------------------------------------------
| 3 | 2 | C | D |
----------------------------------------------
| 4 | 1 | A | B |
----------------------------------------------
| 5 | 2 | D | C |
----------------------------------------------
| 6 | 1 | B | E |
----------------------------------------------
| 7 | 3 | E | F |
----------------------------------------------
您实际上可以在这里看到正在发生的对话... A 与 B (ID 1) 交谈,B (ID 2) 大约在同一时间回复了 (ID 2) C 与 D 开始了新的对话 (CID 2) ( ID 3)。
A 最终向 B 反馈某事(ID 4),而 D 最终回应了 C 之前的询问(ID 5)。然后 B 与 E 谈论他与 A 谈论的同一件事 (CID 1),然后 E 右转并与 F 连接以开始一个全新的对话。
如果这读起来像员工立即解雇之前发生的步骤,那不是故意的,但您并不孤单。
因此您可以看到每个 DB 条目都有一个唯一的 ID (MessageID),但是这些消息需要很容易地整理在一起。
我正在寻求的解决方案是允许数据库创建一个新的和唯一的“ConvoID”。这就是为什么我们不能自动递增,或者我们不能在数据集上强制唯一性的原因。由于本专栏所做的事情的性质,必须发生重复,但自动增量可能会与我正在寻找的完全相反。
任何可以为我指明正确方向的帮助将不胜感激。
谢谢!
【问题讨论】:
-
我不知道我是不是真的明白了,但是你为什么不使用Sender + Recipient作为PK呢?或者您可以添加一个唯一约束以确保发件人 + 收件人是唯一的。
-
应该分成两个或多个表,但我对确切的要求感到困惑。
-
如果您真的想在单个表中执行此操作,请显式锁定表并在插入时使用 MAX(ConvoID) + 1 作为新的 ConvoID。但我不能推荐这个解决方案。