Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуйста создать базу. Есть база такой вот структуры, удоволетворяет всем бизнес-правилам, но уж очень тяжело с ней работать. CREATE TABLE [dbo].[Place] ( [YEAR] [smallint] NOT NULL , [MONTH] [smallint] NOT NULL , [CEX] [smallint] NOT NULL , [GORIZ] [smallint] NOT NULL , [PLACE_Id] [int] IDENTITY (1, 1) NOT NULL PRIMARY KEY CLUSTERED ) CREATE TABLE [dbo].[WORK1] ( [PLACE_ID] [int] NOT NULL FOREIGN KEY REFERENCES [dbo].[Place] ([PLACE_ID]), [NUM] [smallint] NOT NULL , [W1P1] [smallint] NOT NULL , [W1P2] [smallint] NOT NULL , [W1P3] [smallint] NOT NULL , [W1P4] [smallint] NOT NULL, [ROW_ID] [int] IDENTITY (1, 1) NOT NULL ) CREATE TABLE [dbo].[WORK2] ( [PLACE_ID] [int] NOT NULL FOREIGN KEY REFERENCES [dbo].[Place] ([PLACE_ID]), [NUM] [smallint] NOT NULL , [W2P1] [smallint] NOT NULL , [W2P2] [smallint] NOT NULL , [W2P3] [smallint] NOT NULL , [W2P4] [smallint] NOT NULL [ROW_ID] [int] IDENTITY (1, 1) NOT NULL ) CREATE TABLE [dbo].[WORK3] ( [PLACE_ID] [int] NOT NULL FOREIGN KEY REFERENCES [dbo].[Place] ([PLAC_ID]), [NUM] [smallint] NOT NULL , [W3P1] [smallint] NOT NULL , [W3P2] [smallint] NOT NULL , [W3P3] [smallint] NOT NULL [ROW_ID] [int] IDENTITY (1, 1) NOT NULL ) CREATE TABLE [dbo].[WORK4] ( [PLACE_ID] [int] NOT NULL FOREIGN KEY REFERENCES [dbo].[Place] ([PLAC_ID]), [NUM] [smallint] NOT NULL , [W4P1] [smallint] NOT NULL [ROW_ID][int] IDENTITY (1, 1) NOT NULL) CREATE TABLE [dbo].[Remain] ( [Place_Id] [int] NOT NULL , [Rem1W1P1] [numeric](6, 2) NULL , [Rem1W2P2] [numeric](6, 2) NULL , [AddW1P1] [numeric](6, 2) NULL , [AddW2P2] [numeric](6, 2) NULL , [RedW1P1] [numeric](5, 1) NULL , [RedW2P2] [numeric](5, 1) NULL , [Rem2W1P2] [numeric](6, 2) NULL , [Rem2W2P2] [numeric](6, 2) NULL ) Смысл данных в таблицах Place Cex-цех где работала установка(цехов всего 5), Goriz-горизонт в этом цехе(в каждом цехе несколько горизонтов, до 10). В одном месяце установка может работать на разных горизонтах в одном цехе, и может работать в разных цехах. Таблицы типа WORKn описывают разные виды работ выполняемые установками. Например WORK1 содержит данные по выполненным работам первого вида в течении месяца, поля типа WnPn-хорактеризуют этот вид работ. Num-номер установки(в основном но не всегда работают в течении месяца только в одном цехе, в каждом цехе их примерно по 15). Place_Id - понятно из связи. Одному "месту" в каждой из таблиц "Работ" может соответствоть по несколько записей. Например установка в мая в сехе №1 на 1-горизонте выполняла как первый вид работ так и второй. Причем, например в таблице WORK1 одной записи из Place будет соответствовать 2 записи, т.к при выполнении работы 1-го вида показатель W1P3 имел вначале одно значение, а потом изменился на другое, и это надо учитывать. Правила обеспечивающие верность хранимых данных в других таблицах типа WORKn такие же. Remain-таблица остатков. Содержит суммарные данные по горизонту в каждом цехе за месяц. Rem2***-остаток на конец месяца. В конце текущего этот остаток становится остатком на начало следующего - Rem1***. AddW1P1 - хоть по умолчанию и должен содержать суму по горизонту в цехе по строкам из таблици WORK1 значений показателя W1P1, но может и довольно часто редактируется(такова технология работ), с AddW2P2 то-же самое. С RedW1P1 и RedW2P2 все также как с пердыдущими, только берутся они из неуказанных здесь таблиц(описывающих работу установок другого вида). С таблицей Remain и основные проблеммы. Не понятно когда и как лучше ее заполнять(может тригера написать на изменение в таблицах WORK1 и WORK2 подсчитывающие сумму и корректирующие таблицу Remain, толи из клеенского приложение это делать), ну в общем с этой таблицей все как то очень плохо. Также мне кажется что в запросе вообще невозможно правильно соеденить например таблици Place, Work1 и Work2, т.к. одной записи из таблицы Place в таблице WORK1 может соответсвовать 2 записи, а в таблице WORK2 только одна. Как здесь сопоставлять строки учитывая номер установки вообще не понятно. Я думаю что все проблеммы из -за неправильной структуры базы, но исправить это не хватает знаний. Помогите пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2005, 14:47 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Уважаемый, приведите, пожалуйства, вашу схему в виде рисунка. Иначе очень трудно ее воспринять и понять. Тем более с неинформативными названиями таблиц вроде WORK1. Хотите помощи - сделайте шаг навстречу помощникам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 07:06 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Извеняюсь за не правильный скрипт для базы, вот рабочий и схема в виде рисунка. Правда ни как не могу понять как прикрепить рисунок. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 08:38 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Что касается меня, то я бы: 1. Оставил только одну таблицу Work (из существующих четырех) и добавил в нее поле WorkID 2. Создал бы таблицу Works с полями WorkID и Work_Name 3. Связал бы эти таблицы по WorkID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 09:08 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
maxim7474Num-номер установки(в основном но не всегда работают в течении месяца только в одном цехе, в каждом цехе их примерно по 15). Place_Id - понятно из связи. Одному "месту" в каждой из таблиц "Работ" может соответствоть по несколько записей. Например установка в мая в сехе №1 на 1-горизонте выполняла как первый вид работ так и второй. Причем, например в таблице WORK1 одной записи из Place будет соответствовать 2 записи, т.к при выполнении работы 1-го вида показатель W1P3 имел вначале одно значение, а потом изменился на другое, и это надо учитывать. Правила обеспечивающие верность хранимых данных в других таблицах типа WORKn такие же. Remain-таблица остатков. Содержит суммарные данные по горизонту в каждом цехе за месяц. Rem2***-остаток на конец месяца. В конце текущего этот остаток становится остатком на начало следующего - Rem1***. AddW1P1 - хоть по умолчанию и должен содержать суму по горизонту в цехе по строкам из таблици WORK1 значений показателя W1P1, но может и довольно часто редактируется(такова технология работ), [] С таблицей Remain и основные проблеммы. Не понятно когда и как лучше ее заполнять(может тригера написать на изменение в таблицах WORK1 и WORK2 подсчитывающие сумму и корректирующие таблицу Remain, толи из клеенского приложение это делать), ну в общем с этой таблицей все как то очень плохо. Также мне кажется что в запросе вообще невозможно правильно соеденить например таблици Place, Work1 и Work2, т.к. одной записи из таблицы Place в таблице WORK1 может соответсвовать 2 записи, а в таблице WORK2 только одна. Как здесь сопоставлять строки учитывая номер установки вообще не понятно. Я думаю что все проблеммы из -за неправильной структуры базы, но исправить это не хватает знаний. Помогите пожалуйста. Логическая структура БД суть запись некоторых, наиболее фундаментальных бизнес-правил. Из этого в частности вытекают бизнес-ключи. 1)Каково правило для WORK<n> и что является бизнес-ключом? Могу предположить, что это ([PLACE_ID] ,[NUM] ,[W1P3] если есть, [W1P4] если есть ). Или допустимы полностью дублирующиеся (за исключением суррогатного ключа ROW_ID) записи? Если все же бизнес-ключ существует, то введите соответствующее UNIQUE ограничение. 2)Остатки должны быть в разезе номеров установок? - тогда действительно опечатка в структуре REMAINS. Опять таки определите его бизнес ключ, для начала простым русским языком типа Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 12:26 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
ModelR 1)Каково правило для WORK<n Из написанного вами не ясно, существуют ли бизнес-правила уникальности записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 12:30 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
maxim7474 AddW1P1 - хоть по умолчанию и должен содержать суму по горизонту в цехе по строкам из таблици WORK1 значений показателя W1P1, но может и довольно часто редактируется(такова технология работ), с AddW2P2 то-же самоеИногда лучше иметь или отдельное поле или отдельную таблицу для данных, введенных вручную и для вычисленных автоматически, или флаг обозначающий источник данных - зависит от логики приложения. Например, может существовать запрет на автоматический расчет после редактирования вручную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 12:41 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Установка это экскаватор. В течении одного месяца он может перемещатся по горизонтам внутри карьера и более того может быть переведен в другой карьер. Код: plaintext Код: plaintext Код: plaintext Код: plaintext Код: plaintext Rem1W1P1-остаток руды на начало месяца, [Rem1W2P2] - остаток вскрыши на начало месяца, [AddW1P1]-прибыло(взорвано) руды на горизонте в течении месяца, [AddW2P2]-прибыло(взорвано) вскрыши на горизонте в течении месяца, [RedW1P1]-убыло(отгружено) руды(SUM(W1P1) с группировкой по горизонту в карьере за месяц), [RedW2P2]-убыло(отгружено) вскрыши (SUM(W2P1*W2P2+W3P1) с группировкой по горизонту в карьере за месяц), [Rem2W1P2]-остаток руды на конец месяца, [Rem2W2P2]-остаток вскрыши на конец месяца). Уникальность записи обеспечивается первичным ключом. Код: plaintext Если вести справочник установок типа (Год,Месяц,Цех..дальше не знаю что) то по моему это излишне все усложнит, и как понять что и где он отгружал если в течении месяца он работал в двух карьерах(по суткам учет не ведется). Если объеденить таблицы WORKn в одну, как пердложил Станислав C, то ведь работы оцениваются по разному-различные типы данных для хранения показателей разное их количество и как при этом обеспечить бизнес-правила(уникальность записи). Самое удобное для анализа данных вводимых данных, непосредственно при вводе свернуть таблицы WORKn в одну но так- (Place_Id, Num, W1P1, W1P2, W1P3, W1P4, W2P1, W2P2, ....., W4P1) но как при этом обеспечить уникальность строки согластно бизнес-правилам я не смог догадаться. Если посмотреть внимательно то если соеденить требования на уникальность строки от таблицы WORK1 с требованиями таблицы WORK2 и т.д., то это не будет правильным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 14:53 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
maxim7474... WORK1-описывает отгрузку руды на ж.д. транспорт, W1P1 - количество вагонов отгруженой руды (шт.), W1P2 - загрузка вагонов(м.куб.), W1P3 - удельный вес руды, W1P4 - расстояние от места погрузки вагонов(экскаватора) до места выгрузки вагонов(км.). ... WORK2 - описывает отгрузку вскрыши на ж.д. транспорт, здесь все тоже самое что и при отгрузке руды. ... WORK3- отгрузка вскрыши на автотранспорт. W3P1-объем отгруженой вскрыши(м.куб.), W3P2 - удельный вес вскрыши, W3P2 - растояние(км.). ... WORK4 - бестранспортная перевалка. W4P1 - объем в м.куб А теперь абстрагируйтесь от структуры и найдите совпадения... Что мы видим в таблицах: - во всех есть объем (куб.м); - в трех из четырех - удельный вес и расстояние - в двух - количество вагонов (шт)... Таким образом, можно объединить все четыре структуры в одну без ущерба для данных... Например: Р1 - количество (шт), Р2 - объем (куб.м), Р3 - удельный вес, Р4 - расстояние (км). Для идентификации вида работ - использовать идентификатор (WorkID). Таким образом, для работ Work1 и Work2 будут заполнены все поля (Р1-Р4), для работы Work3 будут заполнены поля Р2-Р4, а для работы Work4 - только поле Р2... А вот как их в дальнейшем интерпретировать - это уже проблема не схемы данных, а бизнес-логики... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 15:11 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Кроме того, если проанализировать условия отбора записей, то получится, что в трех таблицах уникальность записи определяется удельным весом и расстоянием, а в четвертой - объемом переложенной руды или породы... Таким образом, три из четырех таблиц (WORK1,WORK2 и WORK3 )можно объединить на 100%! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 15:23 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Станислав C. А вот как их в дальнейшем интерпретировать - это уже проблема не схемы данных, а бизнес-логики... ИМХО неверное разделение. Схема базы данных _должна_ поддерживать стабильную часть бизнес-логики. Если ожидается, что схемы показателей WORKn меняются, хотя бы медленно, раз в год, то да, есть смысл переходить на обобщенную структуру. Если они стабильны много лет, лучше, когда DDL уже отражает бизнес логику. Это в принципе, однако первые три таблицы действительно имеют тождественную структуру ключей и изначально их вполне можно обобщить. Однако не стал бы затевать переделку, если какая-то часть системы уже написана. По крацней мере сейчас нет NULL полей. авторWORK4 - бестранспортная перевалка. W4P1 - объем в м.куб ALTER TABLE [dbo].[WORK4] WITH NOCHECK ADD CONSTRAINT [IX_WORK4] UNIQUE NONCLUSTERED ([PLACE_ID], [NUM], [W4P1]) ON [PRIMARY] не понял, для чего [W4P1] в ключе - это же как раз значение показателя, а не его признак? Если учет остатки и обороты по установкам не нужны, то в чем заморочка с авторКак здесь сопоставлять строки учитывая номер установки вообще не понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2005, 15:47 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Да дествительно я как то не заметил, что при обьединении 3-х таблиц с уникальностью записи все впарядке, спасибо. На самом деле можно сказать что ни чего еще не написано. Идет переделка проекта написанного на FoxPro(dos). Там база такая (Year, Month, Cex, Goriz, Num, W1P1, W1P2, W1P3, W1P4, W2P1, W2P2, ....., W4P1) и таблицы Remain. Она очень удобна анализа данных непосредственно при вводе, но ни как не соответствует бизнес-правилам, постоянное дублирование данных. То что представил за существующую БД. Это мой вариант, по моему такая схема хорошо потдерживает бизнес-правила(это касается таблиц работ). Перечень показателей действительно был стабилен несколько лет, но пришло новое руководство и система учета подвержена изменениям, понятно что переждать это у меня нет возможность. Хочу еще уточноть - хоть в таблицах и есть везде м.куб. но загрузка думпкар(вагонов) и объем добытой вскрыши, перевалки показатели по сути разные и выражаются несопостовимыми по парядку числами(numeric(3,1) и int(6) - то что я в базе везде указал smallint - это так для упрощения). На счет: "Как здесь сопоставлять строки учитывая номер установки вообще не понятно." - при написании клиенского приложения я сталкиваюсь с не разрешимой проблеммой, с помощью SQL-запросов. Самая удобная форма для ввода(на чем настаевает заказчик) НомКолДумпРудЗагрДумпРудУдРудРастРудКолДумпВскрыш...Перевал2010030.63.51210...600002012030.63.57-...-4-----...150000итого по гориз.... А при моем варианте надо соединять таблицы, например при соединении WORK1 и WORK2, если в одной таблице одной строке из Place соответсвует две строки, для экскаватора №20, а в WORK2 для этой же строки из Place и для этого-же экскаватора №20 только одна то как бы я этого не хотел в результате SQL-запроса я получу произведение числа записей из первой таблицы на число записей из второй. Т.е. необходим достаточно сложный алгоритм на стороне клиента с применением временных таблиц причем рассположенных на HDD т.к. в DELPHI нет таблиц в памяти. Ну и куча других сложностей. Может лучше Num вынести в таблицу Place, а таблицу Remain вообще не связывать. А как бы сделали вы и почему именно так. Подскажите пожалуйста. Уточненеие: на самом деле за то что была отгружена руда или вскрыша на ж.д. транспорт отвечает показатель "удельный вес" если от 2.5 до 3.25 - вскрыша больше руда, на автотранспорт грузят только вскрышу, при перевалка просто не важно что переваливают. В Remain столбци Rem2W1P2 и Rem2W2P2 - чисто вычесляемые, но их присутствие в таблице облегчает перенос остатков с конца месяца на начало следующего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 09:53 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
ОК, Давайте начнем с логики. Речь идет о фиксации некоторых показателей, поэтому удобно изобразить их фунциональными зависимостями. Используя обозначения из вашей формы для ввода Код: plaintext 1. 2. Код: plaintext 1. Код: plaintext 1. Если так, то в вашей форме для ввода не понятно, как в одной строке при одном значении УдРуд может быть ненулевое значение КолДумп и для Вскрыши и для Руды? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 12:30 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
Извеняюсь, привошу форму без сокращений(под формой должна быть подобной EXCEL-евской таблице, в которой они сечас проводят анализ распечатывают результат, а потом "вбивают" его в FoxPro-шную базу) НомКолДумпРудЗагрДумпРудУдРуд РастРудКолДумпВскрышЖдЗагрДумпВскрышЖдУдРудВскрышЖдРастРудВскрышЖдОбъемВскрышАвтУдВскрышАвтРастВскрышЖдПеревал 2010030.63.5121030.63.210500003.17600002010030.63.510-------- 4-----------150000по 100 гориз200---10---50000--21000020----10030.63.210500003.171215030.63.46-------- 8--------700003.212по 130 гориз150---100---120000---....................................... К сожалению я не могу четко понять ваш способ записи функциональных зависимостей. Перевалка: (Место, Ном)->(Объем) ОтгрузкаАвто: (Место,Ном,УдРуд,РастРуд) -> Объем ОтгрузкаЖелдор: (Место,Ном,УдРуд,РастРуд) -> Объем,КолДумп поясните пожалуйста как это трактуется. Во втором варианте не понял куда деть перевалку Если можно но поподробней пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 13:59 |
|
||
|
Помогите пожалуиста построить модель базы (концептуальную и физическую)
|
|||
|---|---|---|---|
|
#18+
maxim7474К сожалению я не могу четко понять ваш способ записи функциональных зависимостей. Перевалка: (Место, Ном)->(Объем) ОтгрузкаАвто: (Место,Ном,УдРуд,РастРуд) -> Объем ОтгрузкаЖелдор: (Место,Ном,УдРуд,РастРуд) -> Объем,КолДумп поясните пожалуйста как это трактуется. Во втором варианте не понял куда деть перевалку Если можно но поподробней пожалуйста. От принятой у Дейта (гл.10 издание 7) отличается явным указанием имени зависмости, которое является хорошим кандидатом для имени таблицы. ИмяЗависимости:(Детерминант) -> Зависимые атрибуты. Перевалка во втором случае такая же как и в первом. По форме ввода теперь все ясно (только заголовок видимо съехал на позицию влево :), она вполне соответствует описанной структуре ФЗ и соответсвенно таблиц. Неприятность при этой форме в том, что изменение значений ведет добавлению/удалению записей в БД, т.е. клиент конечно веселый. Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2005, 15:28 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33112208&tid=1545819]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 404ms |

| 0 / 0 |
