Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как организовать хранение справочников?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nkl
Отправлено: 17 Мая, 2013 - 11:55:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




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

Справочник абнентов:

id | Фамилия | Имя | Отчество | Номер телефона |

Справочник овощей:

id | Название |

Нужно, что бы была возможность быстрого создания нового справочника (Ввел название, описание, указал кол-во полей, на следующем шаге выбрал тип данных (строковый или числовой) и вписал название для каждого поля). Редактирование состава полей справочника. Заполнение справочника и получение данных из него только по ID справочника. Т.е. знаешь id справочника - получаешь все его данные.

Как возможно реализовать это в двух, максимум трех таблицах? Что бы не создавать для каждого справочника новую таблицу?
 
 Top
EuGen Администратор
Отправлено: 17 Мая, 2013 - 12:00:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Ответ очевиден - можно это сделать и в двух и даже в одной таблице. На примере двух таблиц:
0. Создаётся таблица "Справочник справочников". Мета-таблица для справочников по сути. Имеет вид (описания типов полей не указаны, так как очевидны)
meta_dictionaries(id, name, description, create_date)
id - идентификатор справочника
name - имя справочника (автомобили, овощи, картины и т.п.)
остальное - по желанию (description - описание, create_date - дата создания справочник и т.п.)
1. Создаётся таблица данных. Там хранятся все данные. Имеет вид:
dictionaries(id, dictionary_id, name)
- в ней хранятся все данные.
id - просто идентификатор записи,
dictionary_id - id справочника, которому принадлежит запись (из таблицы meta_dictionaries, внешний ключ)
name - само значение


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DelphinPRO
Отправлено: 17 Мая, 2013 - 12:07:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




наверное все-таки три таблицы

Справочники:
ID
NAME

Поля:
ID
ID_DICT - ИД справочника которому принадлежит поле, внешний ключ
TYPE - тип данных (опционально, может и не стоит добавлять это поле)
NAME - название поля справочника

Данные:
ID
ID_FIELD - ИД поля, в котором должны лежать данные
DATA - непосредственно данные

Таким образом при создании справочника, мы добавляем строку в таблицу "справочники". В таблицу "Поля" добавляем набор полей для данного справочника.

?


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
nkl
Отправлено: 17 Мая, 2013 - 12:12:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




DelphinPRO, пока сидел на горшке в голове родилась примерно такая реализация. Спасибо! Так можно любое кол-во справочников с любым кол-вом полей уложить в 3 таблицы!
 
 Top
EuGen Администратор
Отправлено: 17 Мая, 2013 - 12:22:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Если требуется не только одно поле (name), то, разумеется, потребуется 3 таблицы.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
nkl
Отправлено: 20 Мая, 2013 - 00:15:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Теперь возникает вопрос, как это реализовать конкретно в mySQL. В частности, не пойму как сделать последнюю таблицу reference_data(ref_id, field_id, ref_data). Как вы поняли, ref_id и field_id это внешние ключи из таблицы справочников и полей. Можно ли в mySQl сделать внешний ключ field_id, таким образом, что бы значения в нем можно было выбрать из того диапазона столбцов, которые прописаны в таблице reference_field.

Вот так думаю будет более наглядно:
Таблица reference:
reference_id | reference_name | reference_description |
-------------------------------- -------------------------------- ---------
1 | Reference 1 | bla-bla-bla |
2 | Reference 2 | --//--//--//--// |

Таблица reference_field:
field_id | reference_id | field_name |
-------------------------------- --------------------------------
1 | 1 | Field 1 |
2 | 1 | Field 2 |
3 | 1 | Field 3 |
4 | 2 | Field 1 |
5 | 2 | Field 2 |

Таблица reference_data:
ref_id | field_id | field_data |


Можно ли как-то объяснить Мускулу, что если в столбце ref_id таблицы reference_data выбран id первого справочника, тобиш 1, то в столбце field_id можно было бы выбрать id только тех полей, которые относятся к Reference 1, тобиш 1, 2 и 3.?

И вообще, мне кажется что foreign key лучше брать из таблицы reference_field, ведь справочник может быть создан, а поля для него еще нет, поэтому если брать внешний ключ справочника из его первичной таблицы reference, то в field_id можно записать id любого поля, даже не относящегося к выбранному по Id справочнику.

(Отредактировано автором: 20 Мая, 2013 - 06:18:32)

 
 Top
VoVladey
Отправлено: 20 Мая, 2013 - 11:05:22
Post Id


Новичок


Покинул форум
Сообщений всего: 33
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




nkl

посмотри этот топ, я только недавно голову ломал над подобным

http://forum.php.su/topic.php?fo...8&topic=5110
 
 Top
nkl
Отправлено: 21 Мая, 2013 - 14:02:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Янв. 2012  


Помог: 1 раз(а)




Не ребят, тут что-то не то. Как из таблицы с данными произвести выборку? Ничего не пойму. Не получается что-то.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB