0

我有一些用户和代理的数据库,并希望添加一个简单的消息系统。用于将表与其他表中的一个相关联的数据库设计

所以,我有以下简单的一组表:

[users] 
- user_id (PK) 

[agents] 
- agent_id (PK) 

[message_threads] 
- message_thread_id (PK) 

[message] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 

我没有从消息和谁发布的消息,个人的关系。

有一点我卡住了,因为它可能是用户或代理。我认为这是一个普遍存在的问题,但我没有找到这样的讨论。

我知道我有几个选择,但他们都有缺点。

选项1: 我不喜欢这样的消息可以链接到两个不同的帐户。

[message] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 
- user_id (FK users.user_id, ALLOW NULL) 
- agent_id (FK agents.agent_id, ALLOW NULL) 

选项2: 这使它尴尬获得在SELECT的一列的所有消息。

[message_by_user] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 
- user_id (FK users.user_id) 

[message_by_agent] 
- message_id (PK) 
- message_thread_id (FK messages_threads.message_thread_id) 
- agent_id (FK agents.agent_id) 

我不能将用户和代理组合到一个表中。这是成立的。

回答

3

这听起来像用户和代理是超类的每个子类,我会称之为“人员”。您可以为人员提供一张桌子,person_id作为PK。然后,您可以用user_id替换users表中的person_id。同样,将agent_id替换为agents表中的person_id。

注意到在这两个子类表中,用户和代理人,person_id是双重责任。这是它自己桌子上的PK,也是人桌上的FK。这强化了用户与个人之间以及代理与个人之间的IS-A关系的一对一性质。

现在,你所要做的就是建立一个消息和人之间的关系,并嘿presto!视情况而定,消息与用户或代理之间有关系。

这是名为“类表继承”的设计模式的一个实例和名为“共享主键”的实例。通过访问Stackoverflow中的相同名称的标签,或者通过在网络上搜索Martin Fowler对该主题的处理,可以获得关于这些信息的更多信息。

+0

关于这个设计的一个很好的讨论可以在[如何将IS-A关系映射到数据库中?](http://dba.stackexchange.com/questions/5501/how-doi-i-地图-AN-is-a的关系 - 进入 - 一个数据库) – user2045006 2015-01-01 22:18:37

相关问题