|
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
|
|
| 28.07.2013, 21:46 | |
|
Ответы с готовыми решениями:
24
Проектирование базы данных Проектирование базы данных Проектирование базы данных |
|
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
| 29.07.2013, 01:57 | |
|
Если на складе товар неразличим по партиям (дате поступления, сроку хранения) и по месту хранения; на складе не производится пересортица, переоценка, инвентаризация и прочие специфические складские операции, то таблица Склад вообще не нужна. Все необходимые данные можно получить запросом из разности прихода и расхода.
1
|
|
|
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 | |
|
1
|
|
|
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). Правильно? Не по теме:
0
|
|
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|||||||||||||||||||||||||||
| 29.07.2013, 15:30 | |||||||||||||||||||||||||||
|
Поясните, пожалуйста:
1) "в моей системе только 1 склад на котором будут храниться уже купленные материалы" - тогда что такое id? 2) material_po_zakazu_id - это ид заказа? тогда что такое count? общее количество всех материалов в заказе? 3) где в Склад упоминается (и упоминается ли?) material_id ? попробуйте заполнить, у меня получается только так:
1
|
|||||||||||||||||||||||||||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||||||||||||||||||||||||||||||||||||||||||
| 29.07.2013, 15:43 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||
|
Материалы - правильно:
МатериалыПоЗаказу:
Склад:
Связи: МатериалыПоЗаказу.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
|
|
|
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
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||
| 29.07.2013, 16:24 [ТС] | |||
|
cygapb-007,
МатериалыПоЗаказу (material_id) М - 1 Склад (material_id) - так сделать можно? я понимаю, что можно и как вы предложили
0
|
|||
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|
| 29.07.2013, 16:28 | |
|
да, все правильно у вас:
Склад (material_id) < - >> МатериалыПоЗаказу (material_id) (1-M)
1
|
|
|
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
|
|
|
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 | ||||
|
Во вторых если вы согласны с тем, что БД винного погреба схожа с вашей БД, то после прочтения первой главы у вас было бы намного меньше вопросов. В третьих книга позволит избежать вопросов в будущем. или вы никогда не столкнётесь больше с базами данных? Я бы на вашем месте лучше бы рассмотрел предметную область. Как организовано хранение материалов на складе. Рассмотрел бы внимательнее бизнес-процессы. Составил бы список действующих лиц, их цели. Склад(склад как отдельное здание), магазин(как организация), сотрудник, поставщик - это доменные объекты. Их нужно внимательнее искать в предметной области. Если правильно составить список утверждений для предметной области, то вопросов в проектировании не будет. Например Поставщик поставляет магазину от одного и более видов материалов. В заказ включается от одного и более материалов. Склад хранит от одного и более видов материалов. Т к вы описали только малую часть БД то у вас вскоре снова появятся вопросы, и все они будут связаны с недостаточным рассмотрением предметной области.
0
|
||||
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|
| 30.07.2013, 11:58 | |
|
XRuZzz, по постановке задачи очень похоже на следующее:
1.Набрать заказов 2.Получить полный список заказанных товаров 3.Найти где закупить 4.Доставить заказанное
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 02.08.2013, 22:02 [ТС] | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
XRuZzz,
я делаю программу , которая в дальнейшем не будет использоваться каким-то магазином. делаю примерно что-то похожее. в семестре было несколько частей. ил, дл и физическое проектирование. ил и дл уже пройдены и засчитаны, нужно сделать базу данных опираясь на первые 2 шага. их уже не изменишь, хотя может быть было бы неплохо это сделать. делаю не себе, не по моей схеме. нужно придерживаться схемы. сделал уже больше половины и вопросов нет. в любом случае, спасибо, что откликнулись. книгу посмотрю, как появится минутка. спасибо. Добавлено через 6 часов 52 минуты cygapb-007, появилась проблема. при добавлении строк в МатериалыПоЗаказу появляется ошибка:
FK_MaterialOrderMaterials_Warehouse - связь между МатериалыПоЗаказу и Склад. Склад:
МатериалыПоЗаказу:
Материалы:
это просто структура. В таблице склад - material_id уникальный ключ. Связь: Склад (material_id) 1 - М МатериалыПоЗаказу(material_id). Проблема при попытке добавить МатериалПоЗаказу.
Добавлено через 11 минут Я вообще правильно понимаю смысл этих связей? Склад (material_id) < - >> МатериалыПоЗаказу (material_id) (1-M) это значит, что на 1 записи в таблице "Склад" соответсвует 1..М записей таблицы "МатериалыПоЗаказу", правильно? Еще дополню предыдущий пост. После того, как я добавил в Warehouse запись с material_id 1, то код
0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
||||
| 02.08.2013, 23:14 | ||||
|
Материалы - это справочник с первичным ключем ID, для этой таблицы никаких ссылок не требуется, но ссылаться на нее можно (по значениям первичного ключа) Следующая таблица в цепочке - материалы по заказу, то есть для нее должен быть указан FK(material_id) на материалы(id). Для обеспечения возможности ссылаться на эту таблицу для нее необходимо указать первичный или уникальный ключ. Очевидно, это пара (order_id,material_id). Однако проблема в том, что на складе хранятся итоговые данные по материалам из всех заказов, поэтому связать склад по FK с материалами по заказу не получится. Один из возможных способов обеспечения ссылочной целостности - использование триггеров на изменение данных в этой таблице, которые будут автоматически корректировать таблицу Склад. Далее по цепочке склад, у этой таблицы тоже есть уникальный индекс по material_id, но она является подмножеством таблицы материалов. Значит, для нее можно определить FK(material_id) on Материалы(id), а так же ссылаться на нее из МатериалыПоЗаказам (другой способ обеспечения ссылочной целостности). В материалы можно добавить любую запись о новом материале. Далее порядок добавления добавления зависит от выбранного способа: с использованием триггеров добавляются данные в таблицу материалов по заказу (при этом триггер автоматически корректирует таблицу Склад). Либо добавляется запись об отсутстующем материале в Склад, после чего появляется возможность добавить этот материал в список заказанных.
Еще один вариант решения - разорвать все связи вообще и делать все изменения данных через хранимые процедуры. Решение менее затратное по ресурсам, но допускающее потерю целостности за счет «ручных» корректировок данных.
1
|
||||
| 02.08.2013, 23:14 | |
|
Помогаю со студенческими работами здесь
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. Пошагово создадим проект для загрузки изображения. . .
|