Microsoft SQL server. Как правильно связать таблицы в базе данных, какие таблицы добавить?

Всем привет. Нужна ваша помощь в создании базы данных. Не совсем понимаю как правильно связать таблицы в базе данных. Какие таблицы нужно добавить для корректного выполнения этого задания:

Задание 1. Создайте базу данных «Спортивный магазин».
Эта база данных должна содержать информацию о товарах,
продажах, сотрудниках, клиентах. Необходимо хранить
следующую информацию:

  1. О товарах: название товара, вид товара (одежда, обувь,
    и т.д.), количество товара в наличии, себестоимость, производитель,
    цена продажи
  2. О продажах: название проданного товара, цена продажи,
    количество, дата продажи, информация о продавце
    (ФИО сотрудника, выполнившего продажу), информация
    о покупателе (ФИО покупателя, если купил зарегистрированный
    покупатель)
  3. О сотрудниках: ФИО сотрудника, должность, дата приёма
    на работу, пол, зарплата
  4. О клиентах: ФИО клиента, email, контактный телефон,
    пол, история заказов, процент скидки, подписан ли на
    почтовую рассылку.

Можно почитать про нормализацию БД.

https://metanit.com/sql/tutorial/2.1.php

(кривоватый перевод)

1 Симпатия

Дополнительное чтиво:
Руководство по MS SQL Server 2017
Обучающие ресурсы по SQL
Таблицы
Создание первичных ключей
Создание связей по внешнему ключу
Ограничения первичных и внешних ключей
SQL Задачи и решения

1 Симпатия

Исходя из материала, я понимаю что в данном случае нужно в таблицу продажи добавить внешние ключи, который будет ссылаться на товар, клиента и продавца. Только не совсем понимаю:

  1. Как реализовать то, чтобы не было возможности купить 3 товара, если их на складе 2 (как это проверить в таблице с продажами).
  2. Как сделать так, чтобы товар на складе уменьшался по мере его продажи.
  3. В таблице о продажах есть условие “показать информацию о покупателе, если он зарегистрирован”, то есть BuyerId int null что ли? Разве так можно?
  4. И еще нужно ли делать отдельную таблицу GoodsSales в этом случае?

Это в приложении использующем БД обычно проверяют + это может быть нормально, типа доставим когда появится и т.д.

1 Симпатия

А с этим поможете разобраться?

Можно конечно, почему нельзя?
Но я не очень понимаю этот пункт, инфа о покупателе же в любом случае нужна, иначе кому продавать.
Хотя например если человек просто пришел в оффлайн магазин и купил, то её может не быть.

Да я и сам не понимаю полностью. В онлайн-магазине смотреть теоретически ты можешь не регистрируясь. А, если ты покупаешь, то вводишь свои данные. Но в условие написано, так как написано)

Наверно именно для этого и есть такое условие, товара нет, а кто купил непонятно

И вот:

Так вот ведь в условии сказано: количество товара в наличии
Т. е. вести учет наличия…

1 Симпатия

Это только я чувствую себя иногда гением, а иногда тупым (пока чаще, все-таки, тупым), после того, как начал этим всем заниматься? Самооценка сильно упала :grinning: :grinning: :grinning:

Вернулся к этому заданию снова. Пытаюсь сделать следующее:

Хранимая процедура показывает информацию о самом
успешном продавце. Успешность определяется по общей
сумме продаж за всё время

Так вот как сделать так, чтобы цена умножалась еще на количество товара?

create proc sp_best_seller as 
begin
select top 1 s.Name,s.Surname,s.Position,s.Gender,s.Position,s.Salary 
from Sellers s
where exists
(select sum(Price), ProductId
from Goods g join Sales sa on ProductId=g.Id 
group by ProductId)
end

Возможно вообще такое реализовать?

Спасибо, разобрался)