Database 数据库设计:两个实体之间的多个标识关系

Database 数据库设计:两个实体之间的多个标识关系,database,database-design,relational-database,Database,Database Design,Relational Database,我有两个实体user,和message 为了避免为消息代理主键,它应该是一个弱实体,取决于用户,具有来自用户的相同(主键)属性的两个引用-即电子邮件,部分键应该是unix\u时间戳 这是一个好方法吗?是否还有其他好的替代方案?代理密钥从根本上说没有什么对或错-我猜这是一个学术问题,但如果您使用例如用户id、电子邮件id,然后使用时间戳来确定唯一性,那么当同时处理两条消息时,您可能会遇到冲突问题(尽管可能性不大)。这取决于您希望达到的严格程度。代理键的根本错误在于,它大大降低了具有大基数的表的索引

我有两个实体
user
,和
message

为了避免为
消息
代理主键,它应该是一个弱实体,取决于
用户
,具有来自
用户
的相同(主键)属性的两个引用-即
电子邮件
,部分键应该是
unix\u时间戳


这是一个好方法吗?是否还有其他好的替代方案?

代理密钥从根本上说没有什么对或错-我猜这是一个学术问题,但如果您使用例如用户id、电子邮件id,然后使用时间戳来确定唯一性,那么当同时处理两条消息时,您可能会遇到冲突问题(尽管可能性不大)。这取决于您希望达到的严格程度。代理键的根本错误在于,它大大降低了具有大基数的表的索引性能,否则我们可能到处都有代理。是的,您是对的,在这种情况下,部分密钥必须是群集代理。我不想把一切都搞得一团糟,这就是为什么我不谈论那件事。顺便说一句,猜错了。您是对的,为冗余信息创建二级索引会降低写入速度,但不会影响查找,但正如我前面所说的,仅为唯一性维护时间戳是可以的,但也可能有其缺陷。我倾向于查找(我工作过的地方)大多数表(15年以上的多个项目)具有没有重大问题的代理密钥。它通过一致性/模式方法使事情变得更容易。这主要使用Oracle DB,但也使用SQLServer、Postgres