Как лучше привязать товары интернет магазина к городам?
Имеется база товаров, разбитых по категориям. Нужно привязать каждый товар к определенному городу, в зависимости от того, какой город выбрал пользователь, выводить нужные товары.
Загвоздка в том, что в зависимости от города, рассчитывается стоимость доставки. Так же помимо города, может быть населенный пункт в черте города, который никак не прописать в базу, ибо их может быть N кол-во, а может и не быть вовсе. У одного и того же товара может быть разная стоимость, в зависимости от города. Человек выбравший город, может иметь не прямое отношение к нему, а находиться в 2-3 километрах от города.
Суть вопроса:
Как лучше производить запись и выборку товаров? Создавать товар для каждого города и хранить отдельно, либо же привязывать товар к нескольким городам и при выборке проверять есть ли id города в поле привязки? Или есть еще какие то варианты которые я не увидел?
P.S. Движок самописный и найти какие то готовые решения не вариант.
Судя по описанию задачи тут можно выделить 2 логические сущности:
* товары - набор свойств, которые описывают конкретный товар
* город
* товарное предложение - это по сути связь населенного пункта и товара, в котором помимо ссылок на первые два объекта есть еще стоимость доставки. Также можно добавить сюда дополнительное поле - населенный пункт, который будет раскрывать конкретный район место в рамках города, для чего валидна данная цена доставки.
Ну и все.
При извлечении делать join товаров на товарные предложения, и фильтровать по ID Города.
Либо эту инфу выносить в денормализованной форме в товар, но тогда отдеььно сделить за ее консистентностью
Если существует однозначная связь между товарами и местом их получения (городом, населенным пунктом и т.п.) то ее можно зафиксировать, как предложил Игорь Яцевич Игорь Яцевич - но это только 1 часть задачи. Можно фиксировать не город а область, куда входят определенные города. Территориальное деление. А вторая как мне видится, это связь между этой областью (городом) и местом проживания клиента (Иногда возникают ситуации когда конечный пункт практически равноудален от двух крупных городов где есть условный пункт выдачи, и пользователь должен сам решить откуда ему удобнее получить товар) - на этом этапе рассчитывать вторую часть стоимости доставки (при необходимости).
Создавать отдельный товар - очень странное решение, я бы его не советовал.