Форум программистов, компьютерный форум, киберфорум
Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824

Проектирование базы данных

28.07.2013, 21:46. Показов 2770. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.

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

1. Вопрос по связи.
Есть Материалы, есть Склад, есть МатериалыПоЗаказу. МатериалыПоЗаказу в итоге попадут на склад.
Отношения:
1. Материалы: id, name...
2. МатериалыПоЗаказу: id, material_id, count, ...
3. Склад: id, material_po_zakazu_id, count

Связи:
1. Материалы(id) < - >> МатериалыПоЗаказу(material_id)
2. Склад(material_po_zakazu_id) ? - ? МатериалыПоЗаказу(id)

Вопрос: какой вид у 2 связи? По-идее 1:1, потому что одному МатериалыПоЗаказу(id) будет соответствовать одна запись на Складе. Я правильно понимаю?

2. А не лучше ли будет сделать связь Склад < - > Материалы? Одной записи в Материалах будет соответствовать 0..1 запись на Складе. Как будет лучше и вообще прав ли я?

Возможно, если еще появятся вопросы буду писать в эту тему.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2013, 21:46
Ответы с готовыми решениями:

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

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

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

24
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
29.07.2013, 01:57
Если на складе товар неразличим по партиям (дате поступления, сроку хранения) и по месту хранения; на складе не производится пересортица, переоценка, инвентаризация и прочие специфические складские операции, то таблица Склад вообще не нужна. Все необходимые данные можно получить запросом из разности прихода и расхода.
1
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
29.07.2013, 02:03  [ТС]
К сожалению нет возможности убрать склад =((( придется делать с ним.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2013, 10:23
в комментах:
Цитата Сообщение от VladSharikov Посмотреть сообщение
1. Вопрос по связи.
Есть Материалы, есть Склад, есть МатериалыПоЗаказу. МатериалыПоЗаказу в итоге попадут на склад.
Отношения:
1. Материалы: id, name...
2. МатериалыПоЗаказу: id, material_id, count, ...
3. Склад: id, material_po_zakazu_id, count -- почему так? почему не material_id? (т.е. Склад: id, material_id, count)
далее понадобится:
4. РазмещениеМатериаловНаХранение: zakaz_id,material_id,count,sklad_id (материалы с одного заказа могут быть размещены на разных складах, в том числе с разбивкой партии материала по разным складам: РазмещениеМатериаловНаХранение.count<Мат ериалыПоЗаказу.count)


Связи:
1. Материалы(id) < - >> МатериалыПоЗаказу(material_id)
2. Склад(material_po_zakazu_id) ? - ? МатериалыПоЗаказу(id)-- тогда здесь будет:
2. Склад(id, material_id) < - >> РазмещениеМатериаловНаХранение(sklad_id, material_id) (много - за счет разных заказов)
3. Склад(material_id) <<-> Материалы(id) (много - за счет разных складов)


Вопрос: какой вид у 2 связи? По-идее 1:1, потому что одному МатериалыПоЗаказу(id) будет соответствовать одна запись на Складе. Я правильно понимаю?

2. А не лучше ли будет сделать связь Склад < - > Материалы? Одной записи в Материалах будет соответствовать 0..1 запись на Складе. Как будет лучше и вообще прав ли я?

Возможно, если еще появятся вопросы буду писать в эту тему.
1
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
29.07.2013, 14:34  [ТС]
cygapb-007, спасибо за ответ!
у вас уже более заточено под реальную систему. у нас пока тока игрушки =) в моей системе только 1 склад на котором будут храниться уже купленные материалы.
Я подумал еще сегодня с утра и, по-идее, будет правильно организовать связь 1:М.
Склад(material_po_zakazu_id) 1 - М МатериалыПоЗаказу(id)
Например: заказали из каталога материалов (Материалы) некоторые материалы. Таблица Материалы: id, material_id, order_id, count. Допустим мы сделали заказ 1, выбрали материал 1, 10 штук. Сделаем заказ 2, выберем материал 1, 20 штук. На склад после каких-то действий (оплаты и т.п.) поставится материал 1, 10 штук и потом добавится материал 1 еще 20 штук. То есть будет 0..М записей МатериалыПоЗаказу(id) к 0..1 записи Склад(material_id). Правильно? В итоге связь Склад(material_po_zakazu_id) 0..1 - 0..М МатериалыПоЗаказу(id). Правильно?

Не по теме:


P.S.: я понимаю, что реальные системы наверное будут другие и наверняка будут лучше этой, но я делаю чужую работу и нужно придерживаться начальной схемы.

0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2013, 15:30
Поясните, пожалуйста:
Цитата Сообщение от VladSharikov Посмотреть сообщение
Материалы: id, name...
С этим вроде все ясно: есть бесконечное хранилище материалов (каталог), из которых формируется заказ, например:
idname
193рога
518копыта
784ласты
2. МатериалыПоЗаказу: id, material_id, count, ...
вроде бы тоже ясно: формируем заказ, включая в него представленные в каталоге товары в потребном количестве, например:
idmaterial_idcount
171932
175184
3. Склад: id, material_po_zakazu_id, count
а вот отсюда начинаются вопросы.
1) "в моей системе только 1 склад на котором будут храниться уже купленные материалы" - тогда что такое id?
2) material_po_zakazu_id - это ид заказа? тогда что такое count? общее количество всех материалов в заказе?
3) где в Склад упоминается (и упоминается ли?) material_id ?
попробуйте заполнить, у меня получается только так:
idmaterial_po_zakazu_idcount
1176
1
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
29.07.2013, 15:43  [ТС]
Материалы - правильно:
idname
193рога
518копыта
784ласты

МатериалыПоЗаказу:
id material_id order_id count
1 193 1 50
2 518 1 100
3 193 2 30
4 518 3 50
5 784 3 120

Склад:
id material_idcount
1 193 80
2 518 150
3 784 120

Связи:
МатериалыПоЗаказу.material_id М - 1 Материалы.id_материала
МатериалыПоЗакзу.material_id М - 1 Склад.material_id - вопрос был по этой связи. я подумал и сделал ее такой. правильно?

Вот. Такое должно получится в итоге. Вопрос по второй связи.

В моем объяснении Склад.material_po_zakazu_id это и есть Склад.material_id для связи с МатериалыПоЗаказу
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2013, 15:54
то есть Склад.id - это номер заказа?
Тогда связь Склад(id,material_id) <-> МатериалыПоЗаказу(id,material_id) (0..1 - 1)

(хотя в такой трактовке первоначальная схема базы изменена )

PS и неясно, может ли в одном заказе быть более одной строки

не, вообще не понял... id - это что, номер строки?
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
29.07.2013, 16:13  [ТС]
cygapb-007, Склад.id просто автоинкрементный индекс таблицы Склад. Как и везде. Материалы.id - первичный ключ, автоинкрементый. МатериалыПоЗаказу.id - автоинкрементный индекс.
id это что-то вроде номера строки. первичный ключ. по нему идентифицируем строку.

На складе нету номера заказа. Для склада он не важен, для склада важен id_материала и его количество.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2013, 16:20
в таблице склад необходим уникальный индекс по полю material_id, никакого автоинкремента в ней не нужно!
Тогда связь Склад(material_id)<->Материалы(id) (0..1 - 1)
1
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
29.07.2013, 16:24  [ТС]
cygapb-007,
Цитата Сообщение от cygapb-007 Посмотреть сообщение
в таблице склад необходим уникальный индекс по полю material_id
так и сделал, но единственное что связь другая. у меня другая связь.
МатериалыПоЗаказу (material_id) М - 1 Склад (material_id) - так сделать можно?

я понимаю, что можно и как вы предложили
Цитата Сообщение от cygapb-007 Посмотреть сообщение
Склад(material_id)<->Материалы(id) (0..1 - 1)
как будет лучше?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2013, 16:28
да, все правильно у вас:
Склад (material_id) < - >> МатериалыПоЗаказу (material_id) (1-M)
1
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
29.07.2013, 16:45  [ТС]
cygapb-007, да, но можно использовать и ваш вариант. по-моему, это тоже будет правильно. разве нет? или это неправильно со стороны проектирования? как будет правильно? вы же тоже не с потолка взяли свой вариант.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
29.07.2013, 17:25
там получается цепочка товары-(1-M)->заказы-(M-0..1)->склад
товары->склад - другая цепочка, лишняя в данном контексте
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
30.07.2013, 00:22
попробуйте почитать "An Introduction to Database Systems" C.J.Date
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
30.07.2013, 00:33  [ТС]
XRuZzz, спасибо, очень ценное замечание, учитывая то, что проблема решена и с моими знаниями без вашей книги. Нужно было просто подтвердить мои догадки. а вы даете книгу с огромным количеством страниц и разделов без конкретного указания на раздел.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
30.07.2013, 11:07
Цитата Сообщение от VladSharikov Посмотреть сообщение
Моя программа должна связать поставщиков материалов со складом моего магазина.
Это очень спорное утверждение. Кому нужна такая программа? Кладовщику или продавцу?

Цитата Сообщение от VladSharikov Посмотреть сообщение
XRuZzz, спасибо, очень ценное замечание, учитывая то, что проблема решена и с моими знаниями без вашей книги. Нужно было просто подтвердить мои догадки. а вы даете книгу с огромным количеством страниц и разделов без конкретного указания на раздел.
Во первых это самый быстрый путь сделать правильно.
Во вторых если вы согласны с тем, что БД винного погреба схожа с вашей БД, то после прочтения первой главы у вас было бы намного меньше вопросов.
В третьих книга позволит избежать вопросов в будущем. или вы никогда не столкнётесь больше с базами данных?

Я бы на вашем месте лучше бы рассмотрел предметную область. Как организовано хранение материалов на складе. Рассмотрел бы внимательнее бизнес-процессы. Составил бы список действующих лиц, их цели.

Склад(склад как отдельное здание), магазин(как организация), сотрудник, поставщик - это доменные объекты. Их нужно внимательнее искать в предметной области.

Если правильно составить список утверждений для предметной области, то вопросов в проектировании не будет.
Например
Поставщик поставляет магазину от одного и более видов материалов.
В заказ включается от одного и более материалов.
Склад хранит от одного и более видов материалов.

Т к вы описали только малую часть БД то у вас вскоре снова появятся вопросы, и все они будут связаны с недостаточным рассмотрением предметной области.

Цитата Сообщение от VladSharikov Посмотреть сообщение
МатериалыПоЗаказу
и названия приведите к нормальному виду, это либо названия сущностей предметной области на русском, либо названия таблиц на английском
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
30.07.2013, 11:58
XRuZzz, по постановке задачи очень похоже на следующее:
1.Набрать заказов
2.Получить полный список заказанных товаров

3.Найти где закупить
4.Доставить заказанное
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
02.08.2013, 22:02  [ТС]
XRuZzz,
я делаю программу , которая в дальнейшем не будет использоваться каким-то магазином. делаю примерно что-то похожее. в семестре было несколько частей. ил, дл и физическое проектирование. ил и дл уже пройдены и засчитаны, нужно сделать базу данных опираясь на первые 2 шага. их уже не изменишь, хотя может быть было бы неплохо это сделать. делаю не себе, не по моей схеме. нужно придерживаться схемы.

Цитата Сообщение от XRuZzz Посмотреть сообщение
все они будут связаны с недостаточным рассмотрением предметной области.
все они? какие вопросы? это был единственный вопрос. бд уже есть и работает. да она охватывает минимум и наверняка не применима для реального магазина, но она сделана, учитывая ил и дл схему, которые УЖЕ были сделаны.
сделал уже больше половины и вопросов нет.

в любом случае, спасибо, что откликнулись. книгу посмотрю, как появится минутка. спасибо.

Добавлено через 6 часов 52 минуты
cygapb-007, появилась проблема.
при добавлении строк в МатериалыПоЗаказу появляется ошибка:
SQL
1
Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK_MaterialOrderMaterials_Warehouse". Конфликт произошел в базе данных "SevansClothes", таблица "dbo.Warehouse", COLUMN 'material_id'.
.
FK_MaterialOrderMaterials_Warehouse - связь между МатериалыПоЗаказу и Склад.

Склад:
id material_idcount
1 193 80
2 518 150
3 784 120

МатериалыПоЗаказу:
id material_id order_id count
1 193 1 50
2 518 1 100
3 193 2 30
4 518 3 50
5 784 3 120

Материалы:
idname
193рога
518копыта
784ласты

это просто структура.

В таблице склад - material_id уникальный ключ. Связь: Склад (material_id) 1 - М МатериалыПоЗаказу(material_id).

Проблема при попытке добавить МатериалПоЗаказу.
SQL
1
INSERT INTO MaterialOrderMaterials (order_id, material_id, COUNT) VALUES (46, 1, 1)
Подскажите как решить такую проблему.

Добавлено через 11 минут
Я вообще правильно понимаю смысл этих связей?
Склад (material_id) < - >> МатериалыПоЗаказу (material_id) (1-M)

это значит, что на 1 записи в таблице "Склад" соответсвует 1..М записей таблицы "МатериалыПоЗаказу", правильно?

Еще дополню предыдущий пост. После того, как я добавил в Warehouse запись с material_id 1, то код
SQL
1
INSERT INTO MaterialOrderMaterials (order_id, material_id, COUNT) VALUES (46, 1, 1)
сработал. то есть он проверял наличие в Warehouse, наверное. так? Получается наоборот. У меня должно быть так: на Склад можно, что то добавить, если это есть в МатериалыПоЗаказу. А у меня наоборот. Как это сделать?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
02.08.2013, 23:14
Цитата Сообщение от VladSharikov Посмотреть сообщение
Склад:
id material_idcount
1 193 80
2 518 150
3 784 120

МатериалыПоЗаказу:
id material_id order_id count
1 193 1 50
2 518 1 100
3 193 2 30
4 518 3 50
5 784 3 120

Материалы:
idname
193рога
518копыта
784ласты
Эээ... Не совсем так. FK может ссылаться только на первичный ключ или на ключ с уникальными значениями.

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

Следующая таблица в цепочке - материалы по заказу, то есть для нее должен быть указан FK(material_id) на материалы(id). Для обеспечения возможности ссылаться на эту таблицу для нее необходимо указать первичный или уникальный ключ. Очевидно, это пара (order_id,material_id). Однако проблема в том, что на складе хранятся итоговые данные по материалам из всех заказов, поэтому связать склад по FK с материалами по заказу не получится.
Один из возможных способов обеспечения ссылочной целостности - использование триггеров на изменение данных в этой таблице, которые будут автоматически корректировать таблицу Склад.

Далее по цепочке склад, у этой таблицы тоже есть уникальный индекс по material_id, но она является подмножеством таблицы материалов. Значит, для нее можно определить FK(material_id) on Материалы(id), а так же ссылаться на нее из МатериалыПоЗаказам (другой способ обеспечения ссылочной целостности).

В материалы можно добавить любую запись о новом материале.
Далее порядок добавления добавления зависит от выбранного способа: с использованием триггеров добавляются данные в таблицу материалов по заказу (при этом триггер автоматически корректирует таблицу Склад).
Либо добавляется запись об отсутстующем материале в Склад, после чего появляется возможность добавить этот материал в список заказанных.
Я вообще правильно понимаю смысл этих связей?
Склад (material_id) < - >> МатериалыПоЗаказу (material_id) (1-M)

это значит, что на 1 записи в таблице "Склад" соответсвует 1..М записей таблицы "МатериалыПоЗаказу", правильно?
Точнее, одной записи в Склад соответствует несколько (0..M) записей в МатериалыПоЗаказу. Соответственно, первичной таблицей является Склад.

Еще дополню предыдущий пост. После того, как я добавил в Warehouse запись с material_id 1, то код
SQL
1
INSERT INTO MaterialOrderMaterials (order_id, material_id, COUNT) VALUES (46, 1, 1)
сработал. то есть он проверял наличие в Warehouse, наверное. так? Получается наоборот. У меня должно быть так: на Склад можно, что то добавить, если это есть в МатериалыПоЗаказу. А у меня наоборот. Как это сделать?
Разорвать связь между этими таблицами и задействовать триггеры. В качестве бонуса - отпадет необходимость обсчитывать итоги по Склад (просуммируются в триггере).

Еще один вариант решения - разорвать все связи вообще и делать все изменения данных через хранимые процедуры. Решение менее затратное по ресурсам, но допускающее потерю целостности за счет «ручных» корректировок данных.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2013, 23:14
Помогаю со студенческими работами здесь

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

Проектирование базы данных
Здравствуйте, форумчане. Просьба помочь с проектированием. Назрели следующие вопросы: 1) Как может выглядеть таблица...

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

Проектирование Базы Данных - литература
Подскажите что почитать по проектированию БД. Также использование внешних ключей. Буду очень благодарен!

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru