Из того, что бросается в глаза:
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) - возможно, можно как-то сузить это
А в целом, вам нужно про нормализацию почитать