Дизайн базы данных по специальной цене для клиентов электронной коммерции B2B

В настоящее время я создаю сайт электронной коммерции B2B. В настоящее время я застрял в определении специальной цены для клиента на конкретный товар.

У меня есть две таблицы, которые:

  • Клиент (данные обычного клиента, такие как имя, пароль и т. д.)
  • Товары (с ценой по умолчанию)

Покупатель может иметь специальные цены на некоторые продукты. Нравиться:

Товар А (стоит 10 долларов (цена по умолчанию)) Покупатель А получил скидку на товар А (стоит 7 долларов для покупателя А)

То, что я имел в виду, было просто средней таблицей с (Клиент (FK), Товар (FK), Специальная цена)

Будет ли это хорошей практикой?

Спасибо!


person Muhaki    schedule 16.07.2020    source источник


Ответы (1)


У вас есть отношения «многие ко многим» между покупателями и товарами, когда покупатель может получить выгоду по специальной цене для 0–N товаров, а товар может быть предложен по специальной цене от 0 до N покупателей.

Как вы уже догадались, правильным способом представления этой связи является создание отдельной таблицы, называемой таблицей моста, которая ссылается на обе другие таблицы через внешние ключи. Кортежи клиентов/товаров должны быть уникальными в таблице моста (простой способ обеспечить это — сделать столбцы кортежем первичного ключа таблицы).

Образец ДДЛ:

create table customers (
    customer_id int primary key,
    name varchar(50),
    -- other relevant columns here
);

create table items (
    item_id int primary key,
    price decimal(10, 3),
    -- other columns here
);

create table customer_items (
    customer_id int references customers(customer_id),
    item_id int references items(item_id),
    price decimal(10, 3),
    primary key (customer_id, item_id)
);

Теперь, скажем, вы хотите получить цену данного товара для данного клиента, вы должны сделать:

select coalesce(ci.price, i.price) price
from items i
left join customer_items ci 
    on  ci.item_id = i.item_id
    and ci.customer_id = :customer_id
where i.item_id = :item_id

... где :customer_id и :item_id представляют соответствующего клиента и товар.

person GMB    schedule 16.07.2020
comment
Спасибо! Это тоже было то, что я думал сделать. Но хотел убедиться! :) - person Muhaki; 17.07.2020