Я подозреваю, что, возможно, я не полностью понял смысл всего вашего дизайна, поэтому я использовал все, что мог, чтобы сделать этот дизайн в 5-й нормальной форме.
Я придерживался мнения, что клиенты, пользователи и продавцы - это люди, играющие роли.
Например, одна из семантических подсказок заключается в том, что «Пол» - это свойство человека, а не вещи, называемой «пользователем». («Пользователь» - это роль, которую играет человек)
Еще одна хорошая практика - хранить все адресные данные в одной таблице.
Каждая из ролей (клиенты, пользователи и продавцы) связана с таблицей адресов с помощью связей PK-FK с таблицей «Персона».
Я сделал предположение, что у одного продукта может быть много вариантов, поэтому варианты имеют свою таблицу.
SQL DDL основан на T-SQL (извините, я не говорю на PostGres, но эта вики должна помочь с этим)
Итак, есть два артефакта: логическая модель в пятой нормальной форме и 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