我对数据库设计有一些疑问。
我有一个用于存储关系的通用表结构。
最近我重构了一些使用这种通用结构而不是直接Fk列的东西,但现在我不确定这是不是最好的主意。
原始架构:
+------------------+ +---------------------+ +----------------------+ | Book | | Note | | MetaParent | |------------------| |---------------------| |----------------------| | Id | | Id | | Id | | NoteId | | MetaParentId:(Null) | | MetaTableId | | +-------+ +----+ KeyValue | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------------+ +---------------------+ +----------------------+
新架构
+------------------+ +---------------------+ +----------------------+ | Book | | Note | | MetaParent | |------------------| |---------------------| |----------------------| | Id | | Id | | Id | | | | MetaParentId:(Null) | | MetaTableId | | + + +----+ KeyValue | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------------+ +---------------------+ +----------------------+
因此,基本上不是在Book和Note之间建立直接的Fk关系,而是使用MetaTableId / KeyValue列通过MetaParent表建立间接关系。
目前,MetaParent表有大约500k条记录,而且事情正在以可接受的方式运行。但是我们每晚都在重建索引。
我担心的是,现在Book和Note之间的关系并不明显。您必须知道一个存在并使用MetaParent表。
同样表现,我不确定在什么时候我们遇到了针对MetaTableId / KeyValue运行太慢的连接问题。看起来你在这个表中添加的查询速度越慢。
答案 0 :(得分:10)
您应该始终使用“普通”FOREIGN KEY强制执行参照完整性。
简而言之,FOREIGN KEYs具有以下优势:
以下是在应用程序代码中强制引用完整性的相应缺点:
这有名字吗?
不是我知道的。我听说过使用“通用FK”这个术语,但这可能并不普遍。
这是好的做法吗?
否(见上文)。
任何性能考虑因素?
是(见上文)。