我怀疑我可能还没有完全理解你所有设计的含义,所以我尽我所能将这个设计做成第五范式。
我认为客户、用户和商家都是扮演角色的人。
例如,语义线索之一是“性别”是人的属性,而不是称为“用户”的事物的属性。 (“用户”是一个人所扮演的角色)
另一个好的做法是将所有地址数据存储在一个表中。
每个角色(客户、用户和商家)都通过使用“Person”表的 PK-FK 关系链接到地址表。
我假设一种产品可以有许多变体,这就是变体有自己的表格的原因。
SQL DDL 基于 T-SQL(抱歉,我不会说 PostGres,但 this wiki 应该能帮上忙)
所以这里有两个人工制品:第五范式的逻辑模型和该逻辑模型的 SQL DDL。
SQL DDL
CREATE SCHEMA Orders
GO
CREATE TABLE Orders.Person
(
personNr int NOT NULL,
addressNr int NOT NULL,
firstName nchar(30) NOT NULL,
gender nchar(6) NOT NULL,
lastName nchar(30) NOT NULL,
CONSTRAINT Person_PK PRIMARY KEY(personNr)
)
GO
CREATE TABLE Orders.Address
(
addressNr int NOT NULL,
city nchar(50) NOT NULL,
countryCode nchar(2) NOT NULL,
postalCode nchar(12) NOT NULL,
street nchar(50) NOT NULL,
CONSTRAINT Address_PK PRIMARY KEY(addressNr)
)
GO
CREATE TABLE Orders.Customer
(
customerNr int NOT NULL,
orderNr int NOT NULL,
stripeID nchar(30) NOT NULL,
CONSTRAINT Customer_PK PRIMARY KEY(customerNr)
)
GO
CREATE TABLE Orders.Merchant
(
merchantNr int NOT NULL,
creationDate datetime NOT NULL,
merchantName nchar(30) NOT NULL,
CONSTRAINT Merchant_PK PRIMARY KEY(merchantNr)
)
GO
CREATE TABLE Orders."User"
(
userNr int NOT NULL,
email nchar(50) NOT NULL,
password nchar(50) NOT NULL,
userName nchar(20) NOT NULL,
CONSTRAINT User_PK PRIMARY KEY(userNr)
)
GO
CREATE TABLE Orders."Order"
(
orderNr int NOT NULL,
orderDate datetime NOT NULL,
orderStatus nchar(10) NOT NULL,
CONSTRAINT Order_PK PRIMARY KEY(orderNr)
)
GO
CREATE TABLE Orders.Product
(
productNr int NOT NULL,
createdDate datetime NOT NULL,
productName nchar(40) NOT NULL,
productStatus nchar(10) NOT NULL,
unitPrice decimal(6,2) NOT NULL,
CONSTRAINT Product_PK PRIMARY KEY(productNr)
)
GO
CREATE TABLE Orders.OrderHasProductInQuantity
(
orderNr int NOT NULL,
productNr int NOT NULL,
quantity smallint NOT NULL,
CONSTRAINT OrderHasProductInQuantity_PK PRIMARY KEY(orderNr, productNr, quantity)
)
GO
CREATE TABLE Orders.Variant
(
variantNr int NOT NULL,
imageURL nchar(200) NOT NULL,
title nchar(20) NOT NULL,
variantPrice decimal(6,2) NOT NULL,
CONSTRAINT Variant_PK PRIMARY KEY(variantNr)
)
GO
CREATE TABLE Orders.PersonLikesProduct
(
personNr int NOT NULL,
productNr int NOT NULL,
CONSTRAINT PersonLikesProduct_PK PRIMARY KEY(personNr, productNr)
)
GO
CREATE TABLE Orders.PersonFollowsMerchant
(
merchantNr int NOT NULL,
personNr int NOT NULL,
CONSTRAINT PersonFollowsMerchant_PK PRIMARY KEY(personNr, merchantNr)
)
GO
ALTER TABLE Orders.Person ADD CONSTRAINT Person_FK FOREIGN KEY (addressNr) REFERENCES Orders.Address (addressNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.Customer ADD CONSTRAINT Customer_FK1 FOREIGN KEY (orderNr) REFERENCES Orders."Order" (orderNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.Customer ADD CONSTRAINT Customer_FK2 FOREIGN KEY (customerNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.Merchant ADD CONSTRAINT Merchant_FK FOREIGN KEY (merchantNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders."User" ADD CONSTRAINT User_FK FOREIGN KEY (userNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.OrderHasProductInQuantity ADD CONSTRAINT OrderHasProductInQuantity_FK1 FOREIGN KEY (orderNr) REFERENCES Orders."Order" (orderNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.OrderHasProductInQuantity ADD CONSTRAINT OrderHasProductInQuantity_FK2 FOREIGN KEY (productNr) REFERENCES Orders.Product (productNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.Variant ADD CONSTRAINT Variant_FK FOREIGN KEY (variantNr) REFERENCES Orders.Product (productNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.PersonLikesProduct ADD CONSTRAINT PersonLikesProduct_FK1 FOREIGN KEY (personNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.PersonLikesProduct ADD CONSTRAINT PersonLikesProduct_FK2 FOREIGN KEY (productNr) REFERENCES Orders.Product (productNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.PersonFollowsMerchant ADD CONSTRAINT PersonFollowsMerchant_FK1 FOREIGN KEY (personNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE Orders.PersonFollowsMerchant ADD CONSTRAINT PersonFollowsMerchant_FK2 FOREIGN KEY (merchantNr) REFERENCES Orders.Merchant (merchantNr) ON DELETE NO ACTION ON UPDATE NO ACTION
GO