我有一些非常繁重的写密集型表(用户跟踪表),它们将不间断地写入。问题是在一个完全规范化的模式上,我将有16个外键。有些键纯粹用于查找引用,有些键是imp,比如链接用户ID、用户会话ID、活动ID等。
有了这么多FK,写密集型表的性能就成了问题。(我有一个用户内容网站,需要接近实时更新)。因此,我计划删除这些写密集型表的所有FK,但在此之前,我想知道我还可以如何链接数据?当人们在代码中说,我们到底在代码级别做了什么来保持数据链接在一起,因为我假设在应用程序中我们不能有关系?
其次,如果我不使用FKs,我假设只要写入正确的ID,数据仍然是一致的?不像如果会员ID是2000,如果出于什么原因没有使用FK,它会写成3000?
最后,这不会影响连接,对吗?虽然我希望避免使用joins,但我可能需要一些。但我假设FKs或非joins仍然可以按原样进行?
发布于 2011-01-20 01:20:09
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约束,有意插入坏值并执行一些作业后清理,或者您可以将这些FK保留在数据库中,否则您将获得所有这些坏数据。
对于这种组合,在应用程序中缓存表是不切实际的,如果你丢弃fk并从应用程序中进行查找,它甚至比在数据库中有fk更慢。
如果答案是"100%肯定的“,那么第二个问题无关紧要。丢弃fk,以快速而自信的方式插入数据。
https://stackoverflow.com/questions/4737055
复制相似问题