表上有多种可能的关系

时间:2010-12-21 20:47:18

标签: mysql foreign-keys

我有一个表,其中包含数据库中各种实体的帐户信息。目前表格设计类似于:

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列将用于告诉程序员哪些交叉引用表可以访问。还有其他选择吗?对于这样的事情,最佳做法是什么?

1 个答案:

答案 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不是自动递增值,您可以提供它们。

然后任何需要引用这三个(非重叠,我假设)表的表都会有一个表来引用哪个表具有标识和类型,后者告诉你哪个子表具有其余的记录数据。

(我很确定这称为超类型/子类型表关系,但我不能肯定地说。)