在我的数据库中,我有帐户,经理和客户的表格。客户和经理都有帐户。 Customer-Account和Manager-Account之间存在两个一对一的关系。我在客户和经理表中都将AccountID作为FK。问题是,现在没有什么能阻止帐户同时与经理和客户联系在一起。我应该如何设计这种关系,或者我应该如何实现这一关系。
答案 0 :(得分:0)
使用帐户类型标记每个帐户。此列可以只包含给定帐户的一个值。
CREATE TABLE Accounts (
account_id INT PRIMARY KEY,
account_type TINYINT NOT NULL,
UNIQUE KEY (account_id, account_type)
);
然后,将每种类型的帐户限制为一种特定的帐户类型。
CREATE TABLE Managers (
account_id INT PRIMARY KEY,
account_type TINYINT NOT NULL DEFAULT 1,
FOREIGN KEY (account_id, account_type)
REFERENCES Accounts(account_id, account_type)
);
CREATE TABLE Customers (
account_id INT PRIMARY KEY,
account_type TINYINT NOT NULL DEFAULT 2,
FOREIGN KEY (account_id, account_type)
REFERENCES Accounts(account_id, account_type)
);
这确定了默认值,但它不会阻止错误的数据,例如在Managers中使用account_type 4创建一行。要建立该约束,可以使用触发器,CHECK约束或外键来实现只有一个值的小桌子。
重新评论:
这种方式的工作方式是首先在Account中插入一行,然后选择account_type:
INSERT INTO Accounts (account_id, account_type) VALUES (123, 1);
现在,此行只能由account_type = 1的行引用。
如果您只在account_type = 1的Managers中插入行,并且从不在具有该account_type的Customers中插入行,那么Accounts中的行只能由Manager引用。
-- First example: works fine
INSERT INTO Managers (account_id, account_type) VALUES (123, 1);
-- Second example: wrong account_type for the Customers table
INSERT INTO Customers (account_id, account_type) VALUES (123, 1);
-- Third example: foreign key error, because Account 123 does not have account_type=2
INSERT INTO Customers (account_id, account_type) VALUES (123, 2);
客户和经理有自己的主键
这没关系。我在我的示例中使用了account_id作为主键,但这是可选的。如果您有不同的主键列,它仍然有效。例如:
CREATE TABLE Managers (
id INT AUTO_INCREMENT PRIMARY KEY,
account_id INT NOT NULL,
account_type TINYINT NOT NULL DEFAULT 1,
FOREIGN KEY (account_id, account_type)
REFERENCES Accounts(account_id, account_type)
);