@Gudsaf
Школьник

Раскритикуете логику моей БД Склада для MySQL (скрины и модель MySQLWrkBnch под катом)?

Модель на скриншоте:
0021fd6178f144879505726164db19c1.PNG

Модель для тех кто хочет пощупать в MySQLWorkbench:
редирект на киберфорум

Таблицы user и rule будут использоваться для разграничения доступа.
Вообще планирую написать клиент на c# vs forms.
  • Вопрос задан
  • 1113 просмотров
Решения вопроса 1
@Gudsaf Автор вопроса
Школьник
Зелим Бельтоев: выбрал второй подход, он рационален. Задумался про единую таблицу для накладных. У меня их два типа - приходная и требование-накладная. Оба вида накладных имеют следующие общие атрибуты:
- ID_рабочего: кто оформил накладную
- ID_единицы: на каком складе оформили накладную
- ID_типа: приходная/накладная требование
- ID_партии: количество и вид товара отпускаемого/расходуемого товара

И тут есть тоже проблемы в логике.
По рабочему и единице можно в лёгкую определить в:
- приходной накладной, куда пришёл товар
- требовании-накладной, откуда ушёл товар
Сейчас всё выглядит так (кликабельно):
c1afe0e6da2e.png

Что если надо в:
- приходной накладной, ОТКУДА пришёл товар
- требовании-накладной, КУДА ушёл товар?

Я пока вижу решение проблемы в следующем: в таблице "Накладная" убрать поле ID_Единицы (оно наследуется с таблицы Рабочий), добавить два поля ID_откуда, ID_куда - эти два новых поля привязать к таблице Административная единица. Вроде ок, но двойные связи ещё не делал не разу, да и опять, колхоз какой-то, у меня даже на попытке это воплотить в реальность воркбенч упал
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Beltoev
Живу в своё удовольствие
Из того, что бросается в глаза:

1. Таблица "rule" - что будете делать, когда появятся новые привилегии? Например, "write_employee". Добавлять новый столбец?
Намного логичнее будет разбить на две таблицы:
rules (id, rule, description)
user_rules (user_id, rule_id)


Таким образом, избавляемся от переизбыточности и нормализуем БД: храним только те привилегии, которые есть у тех или иных пользователей. К тому же, появляется возможность добавления/удаления новых привилегий внутри приложения (правда, нужно учесть привязку прав к тем или иным действиям).

2. Не уловил, зачем в goods_receipt поле product_name, если оно есть в таблице product (опять-таки переизбыточность). Поле price как-то спорно: с одной стороны, тоже дублируем, с другой - стоимость может меняться. Как вариант, можно завести отдельную таблицу для отслеживания изменения цен (в product поле price убрать):
product_prices (id, product_id, price, date_start, date_end (NULL))

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

3. shop и warehouse аналогичны (кстати, что есть поле size?). Можно их заменить двумя другими таблицами:
building (id, name, address, phone, type_id)
building_types (id, name)

То есть, таблицы сооружения и типы сооружений (склад, магазин, ларёк, что-то ещё).

4. Если все склады и магазины расположены в одном городе, то address можно и так оставить. Иначе можно разбить на подтаблицы (город, регион и т. д.)

5. Очень много полей в разных таблицах повторяются (price, phone, address) - возможно, можно как-то сузить это

А в целом, вам нужно про нормализацию почитать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы