如何实现父 table 对子 table 的继承关系
How to implement relationships with inherits at the parent table to the children tables
我正在尝试实现一个在某些 table 之间具有继承关系的数据库,问题涉及三个 table:Customers、Users 和 Addresses(实际上还有更多table 涉及,但有同样的问题,所以..)。
Customers table 继承自 Users table,Users table 与 Addresses table 有关系(分别为 1 到 many)。
所以我的问题是我希望 table 'Customers' 具有与 'Users' 与 'Addresses' 相同的关系,因为 Customers 是从它继承的。我还尝试使用来自 'Customers' 的 ID 将数据插入 'Addresses',但这会产生 foreign key constraint violation, the value doesn't exists in table "myDb.users"
错误
这是我的造型图:
(注意:我实际上使用的是 PostgreSQL,我只是使用 ADO.NET 进行建模,我知道一种解决这个问题的方法,但是如果没有办法通过继承我将把整个数据库更改为完整的关系数据库。)
我假设您正在使用 PostgreSQL table 继承,不幸的是,它并没有像我们预期的那样工作。特别是,虽然来自子 table 的记录出现在来自父 table 的选择中,但它们并没有实际记录在那里,因此它们的 ID 不能用于引用父 table 的外键s.
您可以考虑使用经典方法实现继承:
CREATE TABLE Users(id INT PRIMARY KEY, user_property INT);
CREATE TABLE Customers(id INT PRIMARY KEY REFERENCES Users, customer_property INT);
CREATE TABLE Addresses(user_id INT REFERENCES Users, address TEXT);
通过这种方式,您可以在两个 table 中实际存储客户的属性,并且您可以确定对于每个客户,用户 table 中都有一条记录可以从其他 [=21] 中引用=]s.
-- inserting customer with id=1, user_property=10, customer_property=20
INSERT INTO Users(id, user_property) VALUES (1, 10);
INSERT INTO Customers(id, customer_property) VALUES (1, 20);
-- Inserting address
INSERT INTO Addresses(user_id, address) VALUES (1, 'Wall Street');
缺点是如果你想从两个 tables 获取单个客户的所有属性,你需要加入 Users 和 Customers:
-- All customer properties
SELECT * FROM Customers JOIN Users USING(id) WHERE Customers.id=1;
-- Customer and address
SELECT * FROM Customers JOIN Users USING(id) JOIN Addresses ON Users.id=Addresses.user_id WHERE Customers.id=1;
我正在尝试实现一个在某些 table 之间具有继承关系的数据库,问题涉及三个 table:Customers、Users 和 Addresses(实际上还有更多table 涉及,但有同样的问题,所以..)。
Customers table 继承自 Users table,Users table 与 Addresses table 有关系(分别为 1 到 many)。
所以我的问题是我希望 table 'Customers' 具有与 'Users' 与 'Addresses' 相同的关系,因为 Customers 是从它继承的。我还尝试使用来自 'Customers' 的 ID 将数据插入 'Addresses',但这会产生 foreign key constraint violation, the value doesn't exists in table "myDb.users"
错误
这是我的造型图:
(注意:我实际上使用的是 PostgreSQL,我只是使用 ADO.NET 进行建模,我知道一种解决这个问题的方法,但是如果没有办法通过继承我将把整个数据库更改为完整的关系数据库。)
我假设您正在使用 PostgreSQL table 继承,不幸的是,它并没有像我们预期的那样工作。特别是,虽然来自子 table 的记录出现在来自父 table 的选择中,但它们并没有实际记录在那里,因此它们的 ID 不能用于引用父 table 的外键s.
您可以考虑使用经典方法实现继承:
CREATE TABLE Users(id INT PRIMARY KEY, user_property INT);
CREATE TABLE Customers(id INT PRIMARY KEY REFERENCES Users, customer_property INT);
CREATE TABLE Addresses(user_id INT REFERENCES Users, address TEXT);
通过这种方式,您可以在两个 table 中实际存储客户的属性,并且您可以确定对于每个客户,用户 table 中都有一条记录可以从其他 [=21] 中引用=]s.
-- inserting customer with id=1, user_property=10, customer_property=20
INSERT INTO Users(id, user_property) VALUES (1, 10);
INSERT INTO Customers(id, customer_property) VALUES (1, 20);
-- Inserting address
INSERT INTO Addresses(user_id, address) VALUES (1, 'Wall Street');
缺点是如果你想从两个 tables 获取单个客户的所有属性,你需要加入 Users 和 Customers:
-- All customer properties
SELECT * FROM Customers JOIN Users USING(id) WHERE Customers.id=1;
-- Customer and address
SELECT * FROM Customers JOIN Users USING(id) JOIN Addresses ON Users.id=Addresses.user_id WHERE Customers.id=1;