Быстрым взглядом окинул вашу схему.
1) есть одно правило при построении ER-моделей, звучит оно как-то так "мертвые вороны летят на восток". смысл его в том что таблицы располагаются на диаграмме так что справочники и редко изменяемые таблицы скапливаются в правом нижнем углу, а, соответственно, наиболее изменяемые таблицы в левом верхнем. Если следовать этому правилу читаемость диаграммы базы данных улучшается в разы. Пример:
2)User. по правилам модель доводят до 3,5НФ (или Нормальная форма Бойса-Кодда).(
Список нормальных форм). Так вот таблица User не нормализована должным образом.
Обычно контакты выносят в отдельную таблицу (по крайней мере я бы так сделал). По адресам тоже возможны дубли записей.
Если у вас указание одной из станций метро обязательно для пользователя, то ссылка на город не нужна если есть ссылка на метро. очевидно что каждое метро относиться к одному городу. Если метро не обязательно указывать то тогда ссылку на город оставляем.
3) Product. Обычно продукт это некоторая номенклатура, то есть описание свойств товара, его названия и прочего. Цена в него не входит. Что вы будете делать если придут продукты из разных партий и закупочная цена у них будет разная? Ваша модель этого не отражает. обычно есть некий прайс-лист в котором есть соответствие продукта и цены. прайс-листы в реальной жизни могут меняться и имеют дату на которую этот прайс-лист действителен. Тогда обозначенной мной ситуации не будет. Прайс лист оформляется как минимум двумя таблицами - собственно прайс-листом с общими параметрами как дата создания, составитель ect. и табличной частью, где записаны позиции всех прайс-листов (с ссылкой конечно же) с указанием продукта и его стоимости по конкретному прайс-листу. Валюту можно указать как в конкретных позициях прайс-листа так и глобально на прайс-лист.
"Для всех страниц страниц, таблица url является родителем, хотелось бы что бы удаляя например товар удалялся урл, сейчас на оборот."
Не совсем понял. у кого у всех? думаю у mysql есть настройки внешних ключей OnUpdate, OnDelete. можно через них организовать корректное удаление.
"Таблица пользователей одна для юр и физ лиц, не получается грамотно разделить."
Нормально можно разделить. позже сегодня напишу каким образом. рабочий день закончен и нужно уходить от компа.