Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите со схемой БД

61K
25 октября 2010 года
dims_32
9 / / 25.10.2010
Здравствуйте уважаемые форумчане. Вот встал вопросик по поводу архитектуры будущего приложения.
Даже скорее архитектуры данных.
Стоит нетривиальная задача написать приложение которое бы при вводе наименований автомобильных запчастей
выводила бы марку (список марок) автомобиля в котором используются совместно больше двух любых введенных
пользователем запчастей (запчасти вводятся по номеру).


Например в автомобиле 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 по
этой табличке (по колонке с номерами запчастей) и вывод марки авто. Правда непонятно куда приделать количество и стоимость запчастей.....???
Буду рад если найдется умный человек и поможет со схемой данных для данной интересной задачки.. Не могу понять какие таблички
использовать и в какой конфигурации.. А если кто приведет примеры запросов к этим табличкам так я вообще от счастья в окно выпрыгну.
Просто реально уже башку над этим сломал....
385
25 октября 2010 года
SomewherSomehow
477 / / 25.07.2004
По-моему классическая схема данных должна получиться, типа такой
 
Код:
create table Models(ModelID int, Name varchar(100))
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. Ну и соотв.запросы. Вроде все получается.
61K
26 октября 2010 года
dims_32
9 / / 25.10.2010
Цитата: SomewherSomehow
По-моему классическая схема данных должна получиться, типа такой
 
Код:
create table Models(ModelID int, Name varchar(100))
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. Ну и соотв.запросы. Вроде все получается.



Спасибки... Отношение многие ко многим...
Ну как я мог...

1
26 октября 2010 года
kot_
7.3K / / 20.01.2000
Стесняюсь спросить а что такого нетривиального в задаче?
61K
26 октября 2010 года
dims_32
9 / / 25.10.2010
Еще один ламерский вопросик...

При внесении данных с формы мне придется вносить сразу в три таблицы?
номер запчасти в одну таблицу
марку машины в другую
и количество запчастей в машине в третью (которая и реализуют отношение многие-ко-многим)
385
26 октября 2010 года
SomewherSomehow
477 / / 25.07.2004
Ну это вам виднее, смотря как у вас будет организована логика клиента...
Если у вас можно все внести на одной форме и данные будут сохраняться при закрытии или по кнопке сохранить, то да, в этот момент. Либо у вас данные вводятся на разных формах, либо сохраняются сразу после того как введены...дело вкуса. Но да, три таблицы, три запроса на вставку.

Как совет, организуйте логику работы с БД через хранимые процедуры. Особенно если требуется работать с несколькими таблицами увязанными в общую логику. Например "create procedure Model_delete @ModelID int" - сразу понятно, что эта процедура удаляет определнную модель и вызывается она с клиента один раз, одним запросом к серверу. А уже внутри нее, реализуете логику удаления из связанных таблиц, те самы три запроса delete. Примерно то же самое и со вставкой, разве что, набор параметров побогаче, ну и м.б. будет иметь смысл все же разделить процедуры по созданию разных сущностей, сами уже разберетесь...
61K
26 октября 2010 года
dims_32
9 / / 25.10.2010
Цитата: dims_32
Спасибки... Отношение многие ко многим...
Ну как я мог...



Извиняюсь, я наверное не правильно сформулировал часть задачки, а потом соответственно и вопросы
не правильные начал задавать. Дело в том, что существует не только условие на количество запчастей в машине, но еще у каждой запчасти есть свой числовой атрибут (не важен физический смысл), который разный в каждой марке машины.. Похоже именно этот атрибут (числовой) нужно мне хранить в третьей связующей таблице..

61K
26 октября 2010 года
dims_32
9 / / 25.10.2010
Цитата: SomewherSomehow
Ну это вам виднее, смотря как у вас будет организована логика клиента...
Если у вас можно все внести на одной форме и данные будут сохраняться при закрытии или по кнопке сохранить, то да, в этот момент. Либо у вас данные вводятся на разных формах, либо сохраняются сразу после того как введены...дело вкуса. Но да, три таблицы, три запроса на вставку.

Как совет, организуйте логику работы с БД через хранимые процедуры. Особенно если требуется работать с несколькими таблицами увязанными в общую логику. Например "create procedure Model_delete @ModelID int" - сразу понятно, что эта процедура удаляет определнную модель и вызывается она с клиента один раз, одним запросом к серверу. А уже внутри нее, реализуете логику удаления из связанных таблиц, те самы три запроса delete. Примерно то же самое и со вставкой, разве что, набор параметров побогаче, ну и м.б. будет иметь смысл все же разделить процедуры по созданию разных сущностей, сами уже разберетесь...



спасибо!!

385
26 октября 2010 года
SomewherSomehow
477 / / 25.07.2004
Не за что!

Цитата: dims_32
Дело в том, что существует не только условие на количество запчастей в машине, но еще у каждой запчасти есть свой числовой атрибут (не важен физический смысл), который разный в каждой марке машины.. Похоже именно этот атрибут (числовой) нужно мне хранить в третьей связующей таблице..


Да, конечно. Я об этом и говорил.
[QUOTE=SomewherSomehow]create table ModelsParts(ModelID int, PartID int, Quant int, Price money)[/QUOTE]
Сюда же, можно добавить сколько угодно атрибутов для вхождения каждой конкретной запчасти, в каждую марку машины. Например, в данном случае поле Quant (количество) имеет такой смысл: оно указывает сколько раз входит та или иная запчасть в конкретную модель. То же самое цена - указывает сколько стоит та или иная запчасть для конкретной марки. Соотв. если еще какие-то атрибуты связи - туда же их добавляете. А вот если "количество", имеется ввиду "сколько запчастей есть всего", то это уже характеристика самой сущности "запчасть", а не ее связи с моделью, и по этому такое поле нужно добавлять в таблицу запчастей.
Ну и вот по такому принципу разнесите поля по соотв. таблицам.
Удачи=)

61K
26 октября 2010 года
dims_32
9 / / 25.10.2010
Наконец-то сделал нужную модель данных..
Но тут возник новый вопросик
У меня в запросе есть условие 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
385
26 октября 2010 года
SomewherSomehow
477 / / 25.07.2004
Коль уж заговорили о конкретных запросах, озвучьте субд и версию.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог