Как успешно отделить «заказанные товары» от «товаров» в проекте системы программного обеспечения для покупок? - PullRequest
1 голос
/ 25 апреля 2020

Я занимаюсь разработкой приложения для заказа товаров через Интернет. Сначала я представлю вам часть схемы ER, а затем объясню.

enter image description here

Здесь " products " - это продукты питания. и они будут go внутри fresh_products таблицы. Как видите, fresh_product состоит из product species, category, type, size и product grade.

Затем, когда я размещу заказ, order id и order_status будут сохранены в таблице order. Все заказанные товары будут сохранены в таблице order_item. В таблице order_item вы можете видеть, что у меня прямое соединение с fresh_products.

. В определенные моменты руководство принимает решение об изменении существующего fresh_products. Например, давайте возьмем такие продукты sh, как Тунец . Этот элемент fi sh имеет категорию под названием Loin (выловлена ​​с помощью Loin), после того, как руководство решит удалить его или переименовать, потому что они больше не fi sh с Loin.

Теперь мой дизайн будет затронут из-за вышеуказанных изменений. Почему? Когда вы вносите изменения в любое из полей fresh_product, это напрямую влияет на order_item, в котором хранится информация о уже заказанных товарах. Поэтому, если вы переименуете Loin, все order_item с Loin теперь будут связаны с новым именем, которое неверно. Если вы решите удалить fresh_product, вы также не сможете этого сделать, поскольку к этому существует привязка существующей истории заказов fresh_product.

Мое предложение

В качестве решения этой проблемы я имею в виду удаление отношения fresh_products из order_item. Затем я добавлю String поля в order_item, представляющие все поля fresh_products, например productType, prodyctCategory и т. Д.

Теперь у меня нет прямого соединения с fresh_products, но есть вся необходимая информация. В то же время любой элемент fresh_product может вносить любые изменения, не затрагивая уже приобретенные элементы по адресу order_item.

Мой вопрос: является ли мое предложение лучшим способом решения этой проблемы? Если у вас есть лучшие решения, я открыт.

1 Ответ

0 голосов
/ 25 апреля 2020

Рассмотрим следующее; в этом примере изменяется только название продукта, но вы можете легко добавить столбцы для каждого атрибута (хотя в какой-то момент это переместится из возвышенного в смешное) ...

Кроме того, я редко использую коррелированные подзапросы, поэтому извиняюсь за ошибку ...

create table product_history
(product_id int not null
,product_name varchar(12) not null
,date date not null
,primary key (product_id,date)
);

insert into product_history values
(1,'soda','2020-01-01'),
(1,'pop','2020-01-04'),
(1,'cola','2020-01-07');

create table order_detail
(order_id int not null
,product_id int not null
,quantity int not null default 1
,primary key(order_id,product_id)
);

insert into order_detail values
(100,1,4);

create table orders
(order_id serial primary key
,customer_id int not null
,order_date date not null
);

insert into orders values
(100,22,'2020-01-05');

    SELECT o.order_id
         , o.customer_id
         , o.order_date
         , ph.product_id
         , ph.product_name
         , od.quantity
      FROM orders o
      JOIN order_detail od
        ON od.order_id = o.order_id
      JOIN product_history ph
        ON ph.product_id = od.product_id
     WHERE ph.date IN 
                ( SELECT MAX(x.date) 
                    FROM product_history x
                   WHERE x.product_id = ph.product_id
                     AND x.date <= o.order_date
                );

| order_id | customer_id | order_date | product_id | product_name | quantity |
| -------- | ----------- | ---------- | ---------- | ------------ | -------- |
| 100      | 22          | 2020-01-05 | 1          | pop          | 4        |

---

Просмотр на БД Fiddle

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