我有一个表,其中包含数据库中各种实体的帐户信息。目前表格设计类似于:
CREATE TABLE account (id int(11) NOT NULL auto_increment,
account_id int(11) NOT NULL,
account_type varchar(15) NOT NULL,
balance decimal(12,2) NOT NULL,
PRIMARY KEY (id))
account_id列引用(不是数据库强制执行)3个表中的一个。 account_type列告诉程序员要引用哪个表。我不喜欢这种方法,因为我不能强制执行这种关系,程序员可能会意外地破坏数据。我考虑过做以下其中一项:
为每种类型添加可为空的外键,或删除account_id列并添加交叉引用表以将帐户链接到实体。 account_type列将用于告诉程序员哪些交叉引用表可以访问。还有其他选择吗?对于这样的事情,最佳做法是什么?
答案 0 :(得分:2)
您可以尝试使用主标识表,三个共享标识表从中创建主键。然后,问题中的account
表将链接到主表。松散地描述:
MasterIdentity
Id (autoincrement)
IdentityType (string, maybe FK to a type lookup table, whatever you want)
Table1
Id (PK, FK to MasterIdentity)
other data
Table2
Id (PK, FK to MasterIdentity)
other data
Table3
Id (PK, FK to MasterIdentity)
other data
Account
Id (its own identifier as you already have)
AccountID (FK to MasterIdentity)
other data
插入三个表中的任何一个都将涉及插入MasterIdentity
,从插入中获取范围标识值,并插入到直接指定Id的所需表中。 (当然,这在事务中都必须是原子的。)请注意,三个表上的Id不是自动递增值,您可以提供它们。
然后任何需要引用这三个(非重叠,我假设)表的表都会有一个表来引用哪个表具有标识和类型,后者告诉你哪个子表具有其余的记录数据。
(我很确定这称为超类型/子类型表关系,但我不能肯定地说。)