IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   строки с разными параметрами в MYSQL (https://www.imho.ws/showthread.php?t=84987)

hempsmoke 03.05.2005 15:05

строки с разными параметрами в MYSQL
 
Необходимо сделать небольшую админку, которая управляла бы формами ввода. Например есть 3 каких-то категории, у них есть формы ввода, но с разными полями. (т.е. в одном это поле color, name, id к примеру, а в другой direction, type, id).
вопрос заключается в следущем: как мне организовать запись таких данных в mysql в одну таблицу? т.е. у строк, в зависимости от категории будут разные имена столбцов. Имеет ли смысл делать столбцы для всех и забивать их NULL, если нет значения или лучше создать другую таблицу?

таких категорий(таблиц) планируется много. Т.е. и полей тоже немало (около 100 в общей сложности - т.е. по 3-5 полей от каждой категории.)

Надеюсь я понятно изложил проблему :). Готов объяснить еще подробней.
Спасибо.

Merlin Cori 03.05.2005 15:14

Т.е., если я правильно понял, тебе надо запрос собирать из разных частей, как из конструктора? Можно имя столбца передавать в качестве параметра, а потом подстыковывать к основной части запроса

Madness 03.05.2005 15:25

hempsmoke
Создаешь столбец, где прописываешь тип категории + столбцы с данными, типа data1, data2, data3 и в зависимости от типа категории трактуешь данные по разному. Можно данные вынести в отдельные таблицы. По-моему так логично и понятно.

hempsmoke 03.05.2005 15:41

Merlin Cori
фактически да. часть формы у всех категорий однакова (name,email), а остальные разные.
Цитата:

Можно имя столбца передавать в качестве параметра, а потом подстыковывать к основной части запроса
т.е. ты предлагаешь в таблицу со столбцами id name mail color, если есть данные не для color, а для description, просто создать еще один столбец с именем description, а color заполнить NULL ?

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

Merlin Cori 03.05.2005 15:48

Именно так

Madness 03.05.2005 16:35

Merlin Cori
Так много пустых ячеек получится. Обычно так и делают.

hempsmoke
К таблице добавляешь столбец с типом данных + столбцы с самими данными(в количестве самого большого необходимого числа). В типе ты помечаешь что у тебя в данных хранится и в соответствии с этим обрабатываешь их.

>тогда как же мне сортировать такие данные?
После выборки естессно.

hempsmoke 03.05.2005 17:25

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

Merlin Cori
ну вот у меня и делемма - либо так, либо как Madness говорит. Тока я видно еще не допонял :)

Madness 03.05.2005 17:51

hempsmoke
>еред каждым столбцом еще один вести столбец, который определяет тип следущего?
Бррр, это то накой. Вводишь столбец(data_id) в стоке которого пишешь "профиль", например, а в data1,2,3 - 'nick123','nick123@mail.ru','число постов например'. В своей проге пишешь че-нить типа select * from table where data_id='профиль' и распоряжаешься данными, как данными профиля. Иль, например, data_id='mail', тогда в data1,2,3 например такое - 'nick123@mail.ru','smtp.mail.ru','pop.mail.ru'. И т.д. Соответственно вся логика в программе должна быть.

ЗЫ. Делай как Merlin Cori грит, гемора меньше ;)

hempsmoke 03.05.2005 22:17

Madness
ну да, я так и думал :))

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

Saruman 03.05.2005 22:42

Имхо, хранить кучу данных в одной ячейке, которые могут обновляться независимо - не есть гуд.
Есть еще вариант, который у меня в свое время неплохо работал. Делаем три колонки в таблице:
itemId, fieldType, fieldValue.
Каждый объект, который нужно поместить в таблицу, имеет свой itemId. Для него мы имеем столько записей, сколько полей у этого объекта, с разными значениями fieldType (описывающими тип поля) и fieldValue (его значение). К примеру, если взять в качестве примера объекта "профиль" с id=3 и полями name, password и email, то в таблице для него получим следующее:

3 name Vasya
3 password qwerty
3 email asd@qwe.ru

UNIQUE KEY = (itemId, fieldType)
Ессно, fieldType лучше делать не текстовыми, а enum или внешним ключом в отдельную таблицу описаний. При этом получаем очень гибкую систему с любым количеством полей и отсутствием пустых избыточных ячеек.

AleXXXSoft 04.05.2005 09:08

Цитата:

Saruman:
Имхо, хранить кучу данных в одной ячейке, которые могут обновляться независимо - не есть гуд.
Есть еще вариант, который у меня в свое время неплохо работал. Делаем три колонки в таблице:
itemId, fieldType, fieldValue.
Каждый объект, который нужно поместить в таблицу, имеет свой itemId. Для него мы имеем столько записей, сколько полей у этого объекта, с разными значениями fieldType (описывающими тип поля) и fieldValue (его значение). К примеру, если взять в качестве примера объекта "профиль" с id=3 и полями name, password и email, то в таблице для него получим следующее:

3 name Vasya
3 password qwerty
3 email asd@qwe.ru

UNIQUE KEY = (itemId, fieldType)
Ессно, fieldType лучше делать не текстовыми, а enum или внешним ключом в отдельную таблицу описаний. При этом получаем очень гибкую систему с любым количеством полей и отсутствием пустых избыточных ячеек.
по аналогии сделано хранение настроек в SquirellMail - кстати и сам довольно часто использую

hempsmoke 04.05.2005 22:12

уххх, спасибо. буду пробовать.

Hubbitus 05.05.2005 10:09

Это все здорово, но с точки зрения структуры (да и производительности в большинстве случаев), если это можно вписать в конечное количество отдельных таблиц то наверное так и логичнее будет сделать. Почему этот вариант отбросили?

hempsmoke 05.05.2005 16:29

думал об этом, просто неизвестно сколько этих категорий будет. 20-30?

Hubbitus 05.05.2005 17:20

Цитата:

hempsmoke:
думал об этом, просто неизвестно сколько этих категорий будет. 20-30?
А, ну раз неизвестно количество заранее, тогда действительно лучший вариант помоему предложенный Sarumanом.


Часовой пояс GMT +4, время: 23:49.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.