And*_*ers 3 database-design foreign-keys relational-database
我对数据库设计有一些疑问.
我有一个用于存储关系的通用表结构.
最近我重构了一些使用这种通用结构而不是直接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运行太慢的连接问题.看起来你在这个表中添加的查询速度越慢.
Bra*_*vic 11
您应该始终使用"普通"FOREIGN KEY强制执行参照完整性.
简而言之,FOREIGN KEYs具有以下优点:
以下是在应用程序代码中强制引用完整性的相应缺点:
这有名字吗?
从来没听说过.我听说过使用"通用FK"这个术语,但这可能并不普遍.
这是好习惯吗?
不(见上文).
任何性能考虑?
是的(见上文).