会话/日志表键设计问题

时间:2011-01-21 20:37:42

标签: mysql database database-design

我几乎总是听到人们说不要将FK用于用户会话和任何日志表,因为这些通常是高写表,一旦写入数据几乎总是永远没有任何更新或删除。

但问题是我有这样的colunms: User_id(将会话或活动日志链接到用户) activity_id(将日志活动表链接到系统活动查找表) session_id(将用户日志表与父会话链接) ......还有4-5个colunms。

所以,如果我不使用FK,那我将如何“关联”这些colunms?我可以加入表格并获取没有FK的用户信息吗?我可以在没有FK的情况下编写正确的数据吗任何表现影响或人们只是说话并说这是不是没有?


我的另一个问题是,如果我不使用FK,我仍可以将数据与查找表连接吗?

2 个答案:

答案 0 :(得分:1)

实际上,您可以在mysql中构建没有真正FK的整个数据库。如果您使用MyISAM作为存储引擎,则无论如何FK都不是真实的。 但是,只要连接键匹配,您就可以完成所有您喜欢的连接。

性能影响取决于您填充到引用表中的数据量。如果表中有FK并向其中插入数据或更新FK值,则需要额外的时间。插入或修改后,需要在引用的表中查找FK以确保参考完整性。

在非常需要参考完整性的高度使用的表上,我只是坚持使用松散的列而不是FK。

AFAIK InnoDB是目前唯一支持真正外键的人(除非MySQL 5.5获得支持它们的新的或更新的存储引擎)。像MyISAM这样的存储引擎确实支持语法,但实际上并不验证参照完整性。

答案 1 :(得分:0)

FK在“历史记录”表中可能是有害的。这种表想要保留某个时间点发生的事件的确切状态。

FK的问题是它们不存储值,只是指向值的指针。如果值更改,则历史记录将丢失。您不希望更新级联到历史记录日志中。拥有一个可以加入的“假外键”是可以的,但你也想要对相关字段进行有意去规范化以保留历史记录。