2010-11-06 1 views
0

Я сделал базовую модель автомобиля год/модель/модель подмодели here. Мне сложно сосредоточиться на том, как мне нужно настроить мою базу данных, чтобы продукты знали транспортные средства, к которым они принадлежат.как прикреплять автомобили к моей продукции в моей базе данных схема

Я думаю, что мне нужно сделать еще один стол, служащий для многих отношений между Продуктами и VehicleYears.

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

В этом случае возникает еще одна проблема. Если лет транспортных средств имеют много отношения к продуктам, смогу ли я по-прежнему отфильтровывать категории и/или подкатегории на основе выбранного в данный момент транспортного средства? (продукты относятся к подкатегориям, которые затем относятся к категориям)

Я уверен, что есть способ написать запрос для обработки категорий и подкатегорий, но есть ли лучший способ построить базу данных, чтобы производительность была не " Вопрос? Мои категории/диаграмма товара here.

  • После получения обратной связи здесь мой пересмотренный дизайн here

ответ

1

Да, теоретически вам нужен промежуточный стол от VehicleYears к продукции.

Но я не понимаю ваших автомобилей и автомобилей. АвтомобильYears_VehicleMakes таблиц. Что означает отношение VehicleYears_VehicleMakes? Что продавец сделал в этом году автомобили? Я думаю, что отношения скорее являются подмодельными в год, и если это так, вам даже не нужна таблица для ваших лет, просто поместите два столбца в таблицу подмоделей.

+0

AndreKR, каждый марка автомобиля недоступна с ~ 1930-х годов. Например, Acura не было в 1975 году. В противном случае я бы не сделал отдельного годового стола. Кажется, что, если мне нужно сначала фильтровать по годам, но год связан с подмоделями, тогда я буду запрашивать подмодули в 2010 году для всех моделей вместо того, чтобы выбрать year/make/model/sub model, которая кажется, что это было бы необязательно работа для БД. –

+0

Во-первых, это путь. Получите вашу модель данных правильно. * После *, вы всегда можете ввести кеши, чтобы получить лучшую производительность, например. ввести таблицу, которая отображает годы. Создайте такие таблицы кеша таким образом, чтобы их всегда можно было очистить и восстановить, не влияя на согласованность данных. – AndreKR

+0

+1 Великие мысли думают одинаково :) –

1

Ник, первое, что меня поражает, это то, что вам нужно забыть о год моделирования в виде отдельной таблицы. Поэтому удалите VehicleYears и VehicleYears_VehicleMakes. Вам просто нужно добавить поле года в таблицу VehicleSubModels. Я думаю, год лучше привязан к подмодели автомобиля, а не к автомобилю.

Я думаю, что ссылка, которую вы пытаетесь найти между транспортными средствами и продуктами, - это много: многие между VehiclSubmodels и Items. Ваша новая таблица VehicleProducts будет иметь два поля (составной первичный ключ), содержащий VehicleSubModelId и ItemId.

Моделируя это таким образом, у вас есть очень гранулированный способ связать продукты с транспортными средствами. И вы можете легко достичь своей цели - выбрать автомобиль и получить все перечисленные предметы.

Ваш дизайн для категорий и подкатегорий - это хорошо, но мне интересно, если вы когда-нибудь доберетесь до точки, где вам нужен третий уровень категоризации - SubSubCategory :), если так может быть разумно укусить пулю сейчас и получите это в своем дизайне.

+0

Chris Я считаю, что нет другого способа сделать это, потому что нужно принадлежать годам, чтобы, если вы выберете год 1975, Acura не будет в списке доступных марок. Если вы не можете выбрать марку, вы не можете выбрать модель и подмодуль. Что касается подкатегорий, я хочу, чтобы иерархия была как можно меньшей, чтобы клиенты могли как можно быстрее добраться до продуктов и затем могли принять решение об фильтрации результатов с помощью элементов управления на странице. –

+0

+1 Да, есть другой способ, как мы описали. Так же, как вы хотите, Acura не будет отображаться, когда вы выберете год, потому что, когда вы присоединитесь к отношениям SubModel -> Model -> Make и вы ограничите год до 1975 года, он не будет найден, поскольку нет SubModel (это приводит к модели), которая ведет к Acura. – AndreKR

+0

Теперь я понимаю, что если я сохраню это так, как я думал, если бы Acura была доступна с 1980 года по настоящее время, это означало бы, что каждая модель будет доступна через те годы, что неверно. –

0

Я сделал что-то подобное для издателя, пытающегося присоединить процедуры ремонта к продукту. Продукт идентифицируется первичным ключом из четырех частей: Год, Марка, модель, двигатель, или YMME, и таблица транспортных средств выглядит следующим образом (упрощенно):

VEHICLES 
year integer 
make varchar 
model varchar 
engine varchar 

В таблице PARTS должен быть связан с в таблице ТРАНСПОРТНЫХ СРЕДСТВ. Часть может работать с конкретным годом и делать и модели, но не тогда, когда был установлен определенный движок.

В вашем случае вы должны решить, какое созвездие атрибутов однозначно идентифицирует велосипед. Если вы отслеживаете велосипеды от нескольких производителей, вам нужно СДЕЛАТЬ. Если что-то меняется из года в год, вам нужен ГОД. Если разница между моделью и моделью, вам нужна модель. Если, скажем, часть будет работать, если рама будет алюминиевой, но не если стальная рама, вам понадобится FRAME_MATERIAL или FRAME_GAUGE, вместо ДВИГАТЕЛЯ, или вам понадобится отдельная модель для алюминия, другая для стали.

VEHICLES 
year 
make 
model 
frame 

Тогда вы могли бы просто иметь промежуточную таблицу:

VEHICLE_PARTS 
partid integer foreign key references PARTS 
year 
make 
model 
frame 
... 

или

VEHICLE_PARTS 
partid integer foreign key references PARTS 
year 
make 
model (frame material is handled by a separate model) 

Ваша структура должна ответить на вопрос: Будет ли эта часть работы с , что велосипед? Простое присутствие partid в таблице VEHICLE_PARTS должно подразумевать, что да. Вы действительно хотите избежать наличия поля Исключения в таблице VEHICLE_PARTS, где есть какая-то удобочитаемая человеческая нотация, в которой говорится, что деталь несовместима с рассматриваемым байком, когда используются рули ружей-рупора. Вы действительно должны создать отдельную модель для обработки таких вещей.