Помогите со схемой БД
Даже скорее архитектуры данных.
Стоит нетривиальная задача написать приложение которое бы при вводе наименований автомобильных запчастей
выводила бы марку (список марок) автомобиля в котором используются совместно больше двух любых введенных
пользователем запчастей (запчасти вводятся по номеру).
Например в автомобиле FORD FOCUS используются запчасти с номерами:
933-3883(запчасть 1),
933-8282(запчасть 2),
933-2932(запчасть 3)
933-2139(запчасть 4)
933-2235(запчасть 5)
и т.д.
В автомобиле FORD C-MAX используются запчасти с номерами:
933-3283(запчасть 1),
933-2932(запчасть 2),
933-1112(запчасть 3)
933-2235(запчасть 4)
и т.д.
В автомобиле FORD FUSION используются запчасти с номерами:
933-3283(запчасть 1),
933-2932(запчасть 2),
933-1112(запчасть 3)
и т.д.
Допустим пользователь выбрал запчасти с номерами 933-3283, 933-2932 и 933-1112.
Так как две и больше (в данном случае три) из этих запчастей вместе находятся только в автомобиле марки FORD FUSION, то и программа должна вернуть данную
марку на первом месте, а на втором FORD C-MAX (так как там совместно используется две запчасти) или список марок автомобилей(если эти запчасти также используются вместе). У запчасти есть еще такие атрибуты
как их количество в марке автомобиля (например 2 противотуманки или 3 плафона (в шт.)) и стоимость запчасти.
Еще проблема в том, что запрашивать данные можно разными способами:
1) просто ввести номера запчастей и программа должна выдать марки автомобилей где хотя бы половина выбранных пользователем
запчастей использовалась совместно (для начала хотя бы больше двух наименований)
2) ввести номера запчастей и их количество и программа должна вывести где хотя бы половина выбранных пользователем
запчастей использовалась совместно причем в заданных или меньших количествах (но не больше);
3) ввести номера запчастей и ввести денежную сумму, и программа должна выдать те марки автомобилей? где хотя бы половина
выбранных пользователем запчастей использовалась совместно и сумма их стоимости не превышала бы заданную стоимость.
Результаты надо выводить в зависимости в порядке содержания запчастей в автомобиле (в порядке убывания совместно используемых запчастей)
Также в программе должна быть возможность забивать данные в базу в виде МАРКА АВТО, НОМЕРА ЗАПЧАСТЕЙ В ЭТОМ АВТО, КОЛИЧЕСТВО ЗАПЧАСТЕЙ В ДАННОМ АВТО, ЦЕНА ЗАПЧАСТИ.
Вопрос в том, как организовать хранение данных в БД для удобного их извлечения и занесения, чтобы удобно было реализовать описанную выше логику.
Уже весь мозг себе вынес....
Пока придумал только табличку в виде: МАРКА АВТО, НОМЕРА ЗАПЧАСТЕЙ КОТОРЫЕ ЕСТЬ В ЭТОМ АВТО. А далее full-text search по
этой табличке (по колонке с номерами запчастей) и вывод марки авто. Правда непонятно куда приделать количество и стоимость запчастей.....???
Буду рад если найдется умный человек и поможет со схемой данных для данной интересной задачки.. Не могу понять какие таблички
использовать и в какой конфигурации.. А если кто приведет примеры запросов к этим табличкам так я вообще от счастья в окно выпрыгну.
Просто реально уже башку над этим сломал....
create table Parts(PartID int, PartCode char(8), Name varchar(100))
create table ModelsParts(ModelID int, PartID int, Quant int, Price money)
Далее связь моделей и частей через таблицу модель-часть, индексы на PartCode, ModelID + PartID. Ну и соотв.запросы. Вроде все получается.
create table Parts(PartID int, PartCode char(8), Name varchar(100))
create table ModelsParts(ModelID int, PartID int, Quant int, Price money)
Далее связь моделей и частей через таблицу модель-часть, индексы на PartCode, ModelID + PartID. Ну и соотв.запросы. Вроде все получается.
Спасибки... Отношение многие ко многим...
Ну как я мог...
При внесении данных с формы мне придется вносить сразу в три таблицы?
номер запчасти в одну таблицу
марку машины в другую
и количество запчастей в машине в третью (которая и реализуют отношение многие-ко-многим)
Если у вас можно все внести на одной форме и данные будут сохраняться при закрытии или по кнопке сохранить, то да, в этот момент. Либо у вас данные вводятся на разных формах, либо сохраняются сразу после того как введены...дело вкуса. Но да, три таблицы, три запроса на вставку.
Как совет, организуйте логику работы с БД через хранимые процедуры. Особенно если требуется работать с несколькими таблицами увязанными в общую логику. Например "create procedure Model_delete @ModelID int" - сразу понятно, что эта процедура удаляет определнную модель и вызывается она с клиента один раз, одним запросом к серверу. А уже внутри нее, реализуете логику удаления из связанных таблиц, те самы три запроса delete. Примерно то же самое и со вставкой, разве что, набор параметров побогаче, ну и м.б. будет иметь смысл все же разделить процедуры по созданию разных сущностей, сами уже разберетесь...
Ну как я мог...
Извиняюсь, я наверное не правильно сформулировал часть задачки, а потом соответственно и вопросы
не правильные начал задавать. Дело в том, что существует не только условие на количество запчастей в машине, но еще у каждой запчасти есть свой числовой атрибут (не важен физический смысл), который разный в каждой марке машины.. Похоже именно этот атрибут (числовой) нужно мне хранить в третьей связующей таблице..
Если у вас можно все внести на одной форме и данные будут сохраняться при закрытии или по кнопке сохранить, то да, в этот момент. Либо у вас данные вводятся на разных формах, либо сохраняются сразу после того как введены...дело вкуса. Но да, три таблицы, три запроса на вставку.
Как совет, организуйте логику работы с БД через хранимые процедуры. Особенно если требуется работать с несколькими таблицами увязанными в общую логику. Например "create procedure Model_delete @ModelID int" - сразу понятно, что эта процедура удаляет определнную модель и вызывается она с клиента один раз, одним запросом к серверу. А уже внутри нее, реализуете логику удаления из связанных таблиц, те самы три запроса delete. Примерно то же самое и со вставкой, разве что, набор параметров побогаче, ну и м.б. будет иметь смысл все же разделить процедуры по созданию разных сущностей, сами уже разберетесь...
спасибо!!
Да, конечно. Я об этом и говорил.
[QUOTE=SomewherSomehow]create table ModelsParts(ModelID int, PartID int, Quant int, Price money)[/QUOTE]
Сюда же, можно добавить сколько угодно атрибутов для вхождения каждой конкретной запчасти, в каждую марку машины. Например, в данном случае поле Quant (количество) имеет такой смысл: оно указывает сколько раз входит та или иная запчасть в конкретную модель. То же самое цена - указывает сколько стоит та или иная запчасть для конкретной марки. Соотв. если еще какие-то атрибуты связи - туда же их добавляете. А вот если "количество", имеется ввиду "сколько запчастей есть всего", то это уже характеристика самой сущности "запчасть", а не ее связи с моделью, и по этому такое поле нужно добавлять в таблицу запчастей.
Ну и вот по такому принципу разнесите поля по соотв. таблицам.
Удачи=)
Но тут возник новый вопросик
У меня в запросе есть условие WHERE (имя столбца) IN ('значение1', 'значение2', 'значение3' и т.д.)
Как можно сделать, чтобы запрос искал вхождения НЕ 'значение1' OR 'значение2' OR 'значение3'
а 'значение1' AND 'значение2' AND 'значение3'.
Вообщем значения у меня хранятся в коллекции, а нужно вывести строки БД, в которых
одновременно находились все значения коллекции или хотя бы 3 из 4 (или 2 из 4)
Пример:
name number
значение1 2
значение2 2
значение3 2
значение4 2
значение5 3
значение4 3
значение6 3
значение1 4
значение2 4
значение3 4
запрос..........
WHERE name IN ('значение1', 'значение2', 'значение3', 'значение4')
В результате должен вывести:
number
2
4