Консультация № 187743
13.02.2014, 23:28
81.77 руб.
0 13 1
Здравствуйте! Прошу помощи в следующем вопросе: Подскажите как лучше организовать структуры БД. Имеются несколько устройств, далее они структурируются по типу, по параметрам, Сложность выжывает то, что для каждого устройства присущи свои параметры, получается что нужно для каждого типа устройств создавать отдельную таблицу или нет? Прилагаю ссылку на файл excel, где примерно показана структура БД. А вот как разместить их потаблицам и сделать связи вызвало затруднение, БД планирую делать в акцессе, надеюсь поможите хоть чем-то. ФАЙЛ EXCEL

Обсуждение

Неизвестный
14.02.2014, 21:00
общий
Т.к. у каждого устройства свои индивидуальные параметры, то лучше всего хранить их в отдельных таблицах.
например для устройства "компьютер" используются следующие таблицы:
Comp
Kod счетчик
Name строка ( 50 ) наименование изделия
Tip целое тип из справочника
Firm целое фирма из справочника
Photo целое фото из таблицы фотографий
Video целое видео из таблицы видео
Opis целое описание из таблицы описаний
Instr целое инструкция из таблицы инструкций

Для описания уникальных характеристик используется только одна таблица ( если характеристик больше, то таблицы добавятся )
Tip справочник типов корпуса
Kod счетчик
Name строка ( 50 )

Остальные справочники используются для характеристики и других устройств
Firm справочник фирм
Kod счетчик
Name строка ( 50 ) наименование
Adres строка ( 200 ) адрес в интернете

Photo справочник фотографий
Kod счетчик
Adres строка ( 200 ) путь к файлу фотографии. для нескольких устройств можно использовать одно фото

Video
Kod счетчик
Adres строка ( 200 ) путь к файлу видео

Opis
Kod счетчик
Adres строка ( 200 ) путь к файлу описания

Instr
Kod счетчик
Adres строка ( 200 ) путь к файлу инструкции

Как видно, для описания устройства "компьютер" используется одна уникальная и несколько общих таблиц. Сложность может возникнуть при выводе характеристик всех устройств, т.к. параметры и используемые таблицы отличаются. Поэтому нужно создавать запросы для каждого вида устройств отдельно. Если использовать какое-либо пользовательское приложение, написанное, например, на VisualBasic, то это не проблема.
Неизвестный
14.02.2014, 21:35
общий
Если обработка будет в клиентском приложении, то можно воспользоваться другой логикой.
SprTable
Kod Table_name Table_comment Sec_Table_name
11 nas Насосы sprnas
12 tob Теплообменники sprtob
13 osv Освещение sprosv
14 pu Приборы учета sprpu
15 san Труб-ды и арматура sprsan
Хранится список всех видов устройств. В полях указаны таблица, в которой хранятся характеристики только этого вида устройств, наименование вида и имя таблицы дополнительных характеристик или состава.

SprField
Kod Table_kod Table_type Field_name Field_comment Field_type
15 12 1 nobor Наименование 1
16 13 1 nobor Наименование 1
17 14 1 nobor Наименование 1
1 15 1 nobor Наименование 1
2 15 1 diametr Ду, мм 2
3 15 0 kol Кол-во, шт/ длина, п.м. 2
18 16 1 nobor Наименование 1

Хранится список характеристик для каждого вида устройств
Table_kod хранится код таблицы из SprTable
Table_type в какой таблице ( 0-основной из поля Table_name или 1-дополнительной из поля Sec_Table_name таблицы SprTable ) хранится поле характеристики
Field_name имя поля характеристики
Field_comment наименование характеристики для отчета
Field_type тип поля ( число, строка и т.п. )

Используя такой принцип, можно характеристики всех устройств хранить в нескольких таблицах, которые будут отличаться только типом поля, используемого для характеристики, - число, строка и т.п. Для вывода в Excel будут программно создаваться запросы по видам устройств с перечнем всех характеристик.

В общем, описал муторно. Проще создать образец базы и примерный текст программы на VisualBasic6 ( пишу на нем ) . После выходных попробую.
Неизвестный
15.02.2014, 10:21
общий
Спасибо, то есть, в первом случае, для каждого устройства нужна своя таблица свойств. Тогда как лучше осуществить связи между ними, исключительно по полю код? не уверен что акцесс позволит. Сейчас попробую
давно
Академик
20764
1861
16.02.2014, 11:36
общий
Я бы сделал наоборот: общую таблицу для всех устройств, таблицу типов (устройства на неё ссылаются) и общую же таблицу свойств с полями: ссылка на устройство, имя свойства (строка), значение свойства (тоже строка).
Вероятно, полезна будет таблица описаний свойств, тогда в свойствах вместо имён будут ссылки сюда.
С отдельными таблицами для типов всё очень негибко, и об архитектуре базы надо заботиться заранее, а если потом потребуются изменения (для реальных проектов такое случается наверняка ) то будет совсем тяжело.
Неизвестный
16.02.2014, 12:48
общий
Адресаты:
Можно чуть-чуть поподробнее, например "устройства на неё ссылаются" как это реализовать? и вообще как лучше сделать сявязь между табличами?
давно
Академик
20764
1861
16.02.2014, 14:50
общий
Вы не знаете как в sql ссылки (relations) организованы?
В таблице, на записи в которой ссылаются, заводится числовое поле ID - primary key с автоинкрементом (но вообще это может называться по-разному) а в таблице, которая ссылается, добавляется поле, куда этот id записывается.
Кстати, primary key рекомендуется для каждой таблицы в базе.
Неизвестный
17.02.2014, 17:31
общий
А как будут обрабатываться данные? Прямо в Access или будет какое-то клиентское приложение?
Неизвестный
17.02.2014, 19:18
общий
планирую на delphi софтину писать
Неизвестный
17.02.2014, 20:25
общий

можно в одной таблице хранить весь список в такой структуре
Ustr устройство и общие характеристики для всех
Kod счетчик код устройства
Name строка ( 50 ) наименование устройства
Tip=Tip.Kod целое тип устройства из справочника
Firm целое фирма из справочника
Photo целое фото из таблицы фотографий
Video целое видео из таблицы видео
Opis целое описание из таблицы описаний
Instr целое инструкция из таблицы инструкций
здесь хранятся общие данные для всех устройств.

таблица устройств
Tip справочник устройств
Kod счетчик
Name строка ( 50 )
Tabl строка ( 20 ) имя таблицы, в которой хранятся уникальные характеристики устройств

может еще возникнуть проблема при заполнении уникальных характеристик устройств, т.к. значения характеристики тоже могут быть взяты из справочника, например
Tip.Kod=1
Tip.Name="Компьютеры"
Tip.Tabl="Comp"

Comp таблица устройств "компьютеры"
Kod=Ustr.Kod целое
Tip=Comp_Tip.Kod целое тип компьютера
Ekran дробное размер экрана
CPU=Comp_CPUцелое тип процессора
и т.д.

Comp_Tip справочник типов компьютеров
Kod счетчик
Name строка ( 50 ) моноблок, обычный и т.п.

Comp_CPU сравочник типов процессора
Kod счетчик
Name строка ( 50 ) Intel Pentium G2020
CP целое количество ядер 2
Freq целое частота в МГц 2900
и др.

получается, что дополнительно для вывода характеристик нужно еще хранить запрос типа
select ct.name as [Наименование],c.ekran as [Размер экрана, дюймов],ccpu.name as [Процессор], ccpu.cp as [Количество ядер] …
from ( comp c inner join comp_tip ct on ct.kod=c.tip ) inner join comp_cpu ccpu on ccpu.kod=c.cpu
where c.kod= ustr.kod ( значение подставляется из переменной или поля другой таблицы)
и выводить данные в подтаблице, причем для различных устройств будет разное количество полей. заголовки для столбцов можно взять из названия полей.

я что-то подобное делал, но у меня не было вложенных справочников, а характеристики для каждого типа были разные от 1 до 4 видов.
Неизвестный
17.02.2014, 20:54
общий
в общем, у меня в программе получается так:

Краткая индивидуальная характеристика объекта

Наименование
1
Регулируемый гидроэлеватор РГ-00
Контроллер управления IonSot OC.07. XTC
Термометр ТТ (ТТЖ)
Манометр МТП
Датчик температуры
Вентиль трехходовой


Наименование Ду, мм Кол-во, шт/ длина, п.м.
1 2 3
Кран шаровый 50 1
Кран шаровый 20 2


данные брались из двух справочных таблиц с разным количеством характеристик, но у меня нет вложенных справочников. можно обойтись и без справочников - хранить сразу значения в одной таблице, но тогда база не будет приведена к правильной форме.
Неизвестный
19.02.2014, 00:36
общий
Спасибо, вроде понятно, оформляйте как ответ чтоли)
Неизвестный
19.02.2014, 01:59
общий
днем попробую сделать черновик базы со справочниками для компьютеров и проекторов с парой характеристик для каждого и тогда уже попробую сочинить ответ с примерами запросов.
сам пишу на VB6, могу скопировать текст из программы с комментариями.
Неизвестный
24.02.2014, 11:07
общий
это ответ
Здравствуйте, lexmod!

Можно в одной таблице хранить весь список в такой структуре

Ustr устройство и общие характеристики для всех
Kod счетчик код устройства
Name строка ( 50 ) наименование устройства
Tip=Tip.Kod целое тип устройства из справочника
Firm целое фирма из справочника
Photo целое фото из таблицы фотографий
Video целое видео из таблицы видео
Opis целое описание из таблицы описаний
Instr целое инструкция из таблицы инструкций
здесь хранятся общие данные для всех устройств.

Остальные справочники используются для характеристики и других устройств
Firm справочник фирм
Kod счетчик
Name строка ( 50 ) наименование
Adres строка ( 200 ) адрес в интернете

Photo справочник фотографий
Kod счетчик
Adres строка ( 200 ) путь к файлу фотографии. для нескольких устройств можно использовать одно фото

Video
Kod счетчик
Adres строка ( 200 ) путь к файлу видео

Opis
Kod счетчик
Adres строка ( 200 ) путь к файлу описания

Instr
Kod счетчик
Adres строка ( 200 ) путь к файлу инструкции

таблица устройств
Tip справочник устройств
Kod счетчик
Name строка ( 50 )
Tabl строка ( 20 ) имя таблицы, в которой хранятся уникальные характеристики устройств
Req строка ( 250 ) текст запроса для вывода характеристик


пример заполнения этой таблицы
Tip.Kod=1
Tip.Name="Компьютеры"
Tip.Tabl="Comp"
Req значение приведу ниже

Comp таблица устройств "компьютеры"
Kod=Ustr.Kod целое
Tip=Comp_Tip.Kod целое тип компьютера
Ekran дробное размер экрана
CPU=Comp_CPUцелое тип процессора
и т.д.

Comp_Tip справочник типов компьютеров
Kod счетчик
Name строка ( 50 ) моноблок, обычный и т.п.

Comp_CPU сравочник типов процессора
Kod счетчик
Name строка ( 50 ) Intel Pentium G2020
CP целое количество ядер 2
Freq целое частота в МГц 2900
и др.

получается, что дополнительно для вывода характеристик нужно еще хранить запрос типа
select ct.name as [Наименование],c.ekran as [Размер экрана, дюймов],ccpu.name as [Процессор], ccpu.cp as [Количество ядер] …
from ( comp c inner join comp_tip ct on ct.kod=c.tip ) inner join comp_cpu ccpu on ccpu.kod=c.cpu
where c.kod= ustr.kod ( значение подставляется из переменной или поля другой таблицы)
и выводить данные в подтаблице, причем для различных устройств будет разное количество полей. заголовки для столбцов можно взять из названия полей.

В клиентском приложении выводится основная таблица с типом устройства и общими характеристиками, а во вспомогательной нужно определить количество полей и настроить DBGrid с выводом уникальных характеристик из получившегося запроса.

Если будут еще вопросы - пишите senoj@mail.ru

С уважением.
Форма ответа