从我的写表中删除所有FK

时间:2011-01-19 15:25:31

标签: mysql database database-design

我有一些非常繁重的写密集表(用户跟踪表),它们将不间断地编写。问题是在完全规范化的模式上我将有16个外键。有些键纯粹用于查找引用,有些键则类似于链接用户ID,用户会话ID,活动ID等。

在写入密集型表上使用这么多FK是一个问题。 (我有一个用户内容网站,需要接近实时更新)。所以我打算为这些写密集表删除所有FK但在此之前我想知道我还能如何链接数据?当人们在代码中说,我们在代码级别做了什么来保持数据链接在一起,因为我在应用程序中假设我们不能建立关系?

其次,如果我不使用FK,我认为只要写入核心ID,数据仍然是一致的?不像成员ID是2000,如果因为某种原因没有使用FK,它将写入3000?

最后,这不会影响连接吗?虽然我希望避免加入我可能需要一些。但我认为FKs或不加入仍然可以按原样完成?

1 个答案:

答案 0 :(得分:0)

Secondly, if I dont use FKs I assume data will still be consistent
as long as the the corect ID is written?

Lastly, this will not effect joins right?

右。

When people say in the code, what exactly are we doing at the 
code level to keep data linked together

这是真正的问题。实际上,真的真正的两个问题是:

1)您对输入值是否全部有效并且不需要检查有多大信心。

2)引用的查找表有多大?

如果答案“不太自信”和“非常小”,那么您可以通过在应用层中缓存答案并在插入之前使用这些超快速内存表进行查找来强制执行代码。但是,考虑到这一点,数据库也将缓存那些小表,因此保留fks可能仍然更简单。

如果答案“不太自信”和“非常大”,那么你可以选择。您可以删除FK约束,故意插入错误值并进行一些作业后清理,或者您可以将这些fks保留在数据库中,因为否则您将获得所有这些不良数据。

对于这种组合,在应用程序中缓存表是不切实际的,如果你删除它们并从应用程序执行查找,它甚至比在数据库中使用fk更慢。

如果答案是“100%自信”,那么第二个问题无关紧要。删除fk并快速,自信地插入数据。