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]   

> Описание: Даже описать не знаю как.
XelaNimed
Отправлено: 01 Февраля, 2010 - 00:21:06
Post Id


Частый гость


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


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




Всем доброго и продуктивного времени суток.
Сразу извиняюсь за не информативное описание темы и надеюсь Вы сейчас поймете почему.

Проблема в следующем. Имеется скрипт. Этот скрипт разбирает содержимое HTML-страницы Википедии с описанием исполнителя (группа, певец, трио и т.д.). На выходе имеется массив, вот его то и нужно внести в БД. Тут и начинается проблема.
Разумеется существуют строго определенные данные, такие как год рождения/основания, некие таблицы с уникальными ID, но есть и такие как например "Награды" коих великое множество. Скрипт вне зависимости от содержания заголовка, где кстати может стоять и год и страна, где сию награду получил исполнитель, читает содержимое и вносит его в ассоциативный массив, где ключом как раз и выступает найденный заголовок. В итоге мы получаем массив где стоит примерно следующее:
Спойлер (Отобразить)


Вопрос: существует ли способ внесения полученных данных в БД вне зависимости от названия ключа/имя столбца, но в то же время чтоб пользователь мог иметь возможность в последствии опросить БД на соответствие исполнителя определенным критериям?
К примеру: у одного исполнителя вообще нет наград, а у другого их 30, причем не известно каких. Тупо прописывать все возможные варианты в таблицу скорее всего не получится, так как награда может быть вообще один раз вручена в каком-то году, да и года там также стоять могут. Если прописать названия столбцов под цифровым порядком("Награда_1","Награда_2","Награда_3", и т.д.), то как в последствии обратится к нужному столбцу? Ведь у одного MTV Awards может стоять первым, а у другого последним?

Пожалуйста подскажите хоть направление, куда копать нужно. Сам не силен в БД, да вообще толком их не знаю, поэтому и не знаю с какого боку подойти к этой проблеме.
Заранее благодарен всем, кто откликнется.
 
 Top
Viper
Отправлено: 01 Февраля, 2010 - 08:15:05
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




для строго определенных данных создаете поля соответственно, а для наград я бы сделал поле типа TEXT и записывал бы туда данные с разделителями.

к примеру поле awards в вашем приведенном примере содержало бы

CODE (htmlphp):
скопировать код в буфер обмена
  1. [Grammy]{Best Female R&B Vocal Performance (for Superwoman)}|[World Music Award]Best-Selling New Artist
  2. World's Best-Selling Female R&B-Artist


вариантов разделения может быть много.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
valenok
Отправлено: 01 Февраля, 2010 - 09:26:32
Post Id



Здесь могла бы быть ваша реклама


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


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




Можете использовать нереляционные базы данных.


-----
Truly yours, Sasha.
 
My status
 Top
Phantik
Отправлено: 01 Февраля, 2010 - 13:07:47
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


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




Вообще наиболее правильный подход будет: Каждой сучности - свою таблицу.
Т.е. для вашего случая связь Исполнитель - награды выглядит ввиде 3х таблиц:

1) Табл 1 (исполнители)
id_singer - примари кей исполнителя
name - название
// другие общие данные

2) Табл 2 (награды)
id_reward - примари кей награды
name - название награды
// другие общие данные для описания наград

3) Табл 3(связь наград и исполнителей)
id_singer это внешний ключ к таблице №1
id_rewards это внешний ключ к таблице №2
`datetime' - дата\время вручения
// другие общие данные о вручении награды
Праймери кейем тут можно сделать либо добавочное поле AUTO_INCREMENT либо комбинацию полей в зависимости от логики вручения наград
Например PRIMARY KEY(id_singer,id_rewards,`datetime`)

(Отредактировано автором: 01 Февраля, 2010 - 13:08:57)

 
 Top
biperch
Отправлено: 01 Февраля, 2010 - 18:01:45
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


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




все в одной таблице id имя фамилия и тд. а награды уже в отформатированном виде для вывода записать в поле типа TEXT как было сказано выше, или в тот же TEXT только разобрать награды и через serialized
 
 Top
XelaNimed
Отправлено: 02 Февраля, 2010 - 07:35:12
Post Id


Частый гость


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


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




Всем доброго и продуктивного времени суток.
Я сильно признателен всем, кто откликнулся. Насчет сохранения всех наград в столбце с типом "text"... Проблема то сама не в том чтоб просто сохранить полученные данные, а в том как потом опросить таблицу/ы.
Если я правильно понимаю, то имеется 2 приемлимых варианта.
Первый: сохранить все в таблицу используя разделители;
Второй: все тоже, но с использованием serialize();

Вопрос: как после сохранения вышесказанного составить запрос, который выводил бы к примеру исполнителей имеющих MTV Europe Music Awards? Насколько я понимаю, в случае с serialize() это будет не реально... или?

Phantik пишет:
2) Табл 2 (награды)
id_reward - примари кей награды
name - название награды


Это нереально. Понадобится куча времени, чтоб описать все возможные награды. Причем некоторые из них вообще были вручены единожды. Ищется способ занести в БД данные, причем независимо от названия награды, которые после можно было бы опросить.

P.S.: Читал про индексацию, если честно, то мало чего понял. Знающие люди, подскажите, если в столбец типа "varchar" внести данные содержащие HTML-теги, можно ли будет впоследствии организовать корректный полнотекстовый поиск?
 
 Top
Viper
Отправлено: 02 Февраля, 2010 - 07:47:15
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




XelaNimed пишет:
P.S.: Читал про индексацию, если честно, то мало чего понял. Знающие люди, подскажите, если в столбец типа "varchar" внести данные содержащие HTML-теги, можно ли будет впоследствии организовать корректный полнотекстовый поиск?


что конкретно не поняли?

varchar вам не подойдет, т.к. у него лимит в 256 символов. к тому же для fulltext-поиска лучше тип либо TEXT, либо BLOB.
и ещё момент. если в тексте присутствуют html-теги то без разницы абсолютно, т.к. вы можете их обработать через регулярку в цикле после выборки из БД и убрать.

PS! Если данные с разделителями, то выгребаете нежные данные и потом на php делаете с ними все что угодно. это если не хотите возится, либо не знаете как с сложными структурами БД и вложеными запросами.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
XelaNimed
Отправлено: 02 Февраля, 2010 - 08:24:41
Post Id


Частый гость


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


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




Viper, непонятно следующее. Имеется к примеру кусок HTML-кода:

Спойлер (Отобразить)


насколько я понимаю мне нужно его вносить в базу в столбец типа "text". Подскажите если не трудно, как потом опрашивать таблицу, если на выходе нужно получить список артистов имеющих награду "World Music Award"?
 
 Top
Viper
Отправлено: 02 Февраля, 2010 - 09:12:07
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




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

ИМХО я бы сразу до записи в БД отбрасывал бы html-теги. и база меньше весить будет и более удобоваримо и для вас и для юзера.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
XelaNimed
Отправлено: 02 Февраля, 2010 - 09:24:41
Post Id


Частый гость


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


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




Viper, другими словами,
CODE (SQL):
скопировать код в буфер обмена
  1. " SELECT * FROM table_name WHERE awards LIKE '%World Music Award%' "

Или я что-то недопонимаю?
 
 Top
USB_user
Отправлено: 02 Февраля, 2010 - 09:30:13
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  
Откуда: Киев


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




Лучше всего использовать вариант предложенный Phantik,
А в таблицу с наградами Вы проверяете, если такая награда есть,
то просто присваиваете ее ID в табл.3,
а если такой награды еще нет,
то добавляете ее в таблицу,
а после этого вносите запись в табл.3
 
 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