Это был бы идеальный способ настроить базу данных? - PullRequest
0 голосов
/ 10 мая 2019

Не закончили некоторые отношения, вроде как запутались в этом конце вещей.

Будет ли follows отношением много-к-одному, поскольку покупатель может следовать за многими продавцами, а продавец не может следовать за покупателем?

enter image description here

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Это классическое отношение «многие сквозные».

  • У клиента много подписок
  • У клиента много торговцев, следующих
  • У продавца много подписчиков
  • У продавца много клиентов:

Поскольку отношения существуют между разными моделями (т. Е. Покупатель не может следовать за другим покупателем), вам не нужно создавать полиморфную таблицу;достаточно иметь «следует» в качестве объединения.

0 голосов
/ 10 мая 2019

Я подозреваю, что, возможно, я не полностью понял смысл всего вашего дизайна, поэтому я использовал все, что мог, чтобы сделать этот дизайн в 5-й нормальной форме.

Я придерживался мнения, что клиенты, пользователи и продавцы - это люди, играющие роли. Например, одна из семантических подсказок заключается в том, что «Пол» - это свойство человека, а не вещи, называемой «пользователем». («Пользователь» - это роль, которую играет человек)

Еще одна хорошая практика - хранить все адресные данные в одной таблице. Каждая из ролей (клиенты, пользователи и продавцы) связана с таблицей адресов с помощью связей PK-FK с таблицей «Персона».

Я сделал предположение, что у одного продукта может быть много вариантов, поэтому варианты имеют свою таблицу.

SQL DDL основан на T-SQL (извините, я не говорю на PostGres, но эта вики должна помочь с этим)

Итак, есть два артефакта: логическая модель в пятой нормальной форме и SQL DDL для этой логической модели.

The logical model diagram

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
0 голосов
/ 10 мая 2019

Я думаю, что это будет много-много, так как несколько покупателей могут следить за продавцами, каждый из которых связан с несколькими клиентами. Чтобы нормализовать это отношение, вы должны создать новую таблицу - назовите ее customer_merchants или что-то в этом роде. У этого есть только два столбца, customer_id и merchant_id.

Каждый раз, когда у вас есть покупатель, следующий за продавцом, вы создаете новую строку в customer_merchant, чтобы отразить этот факт.

Теперь у вас есть отношение 1-многие между клиентами и customer_merchants и отношение 1-многие между продавцами и customer_merchants.

Вот веб-страница о нормализации базы данных, которая может помочь вам понять больше: -

https://www.w3schools.in/dbms/database-normalization/

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...