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 :: Создание базы/таблицы с неизвестным количеством/названием столбцов.
Покинул форум
Сообщений всего: 136
Дата рег-ции: Сент. 2009
Помог: 0 раз(а)
Всем доброго и продуктивного времени суток.
Сразу извиняюсь за не информативное описание темы и надеюсь Вы сейчас поймете почему.
Проблема в следующем. Имеется скрипт. Этот скрипт разбирает содержимое HTML-страницы Википедии с описанием исполнителя (группа, певец, трио и т.д.). На выходе имеется массив, вот его то и нужно внести в БД. Тут и начинается проблема.
Разумеется существуют строго определенные данные, такие как год рождения/основания, некие таблицы с уникальными ID, но есть и такие как например "Награды" коих великое множество. Скрипт вне зависимости от содержания заголовка, где кстати может стоять и год и страна, где сию награду получил исполнитель, читает содержимое и вносит его в ассоциативный массив, где ключом как раз и выступает найденный заголовок. В итоге мы получаем массив где стоит примерно следующее:
[World Music Award] =>
Best-Selling New Artist
World's Best-Selling Female R&B-Artist
[Soul Train Music Award] =>
Best Female R&B/Soul Album (for The Diary of Alicia Keys)
Best Female R&B/Soul Single (for If I Ain't Got You)
Best R&B/Soul Single By A Group, Band Or Duo (for My Boo with Usher)
[Billboard Award] =>
Female Artist of the Year
Female R&B/Hip Hop Artist of the Year
R&B/Hip Hop Singles Artist of the Year
R&B/Hip Hop Single of the Year (for If I Ain't Got U)
Hot 100 Songwriter of the Year
Female Hot 100 Artist of the Year
R&B/Hip Hop Airplay Single of the Year (for If I Ain't Got U)
[American Music Awards] =>
Favorite Album, Soul/R&B (for As I Am)
Favorite Album, Rock/Pop (for As I Am)
)
Вопрос: существует ли способ внесения полученных данных в БД вне зависимости от названия ключа/имя столбца, но в то же время чтоб пользователь мог иметь возможность в последствии опросить БД на соответствие исполнителя определенным критериям?
К примеру: у одного исполнителя вообще нет наград, а у другого их 30, причем не известно каких. Тупо прописывать все возможные варианты в таблицу скорее всего не получится, так как награда может быть вообще один раз вручена в каком-то году, да и года там также стоять могут. Если прописать названия столбцов под цифровым порядком("Награда_1","Награда_2","Награда_3", и т.д.), то как в последствии обратится к нужному столбцу? Ведь у одного MTV Awards может стоять первым, а у другого последним?
Пожалуйста подскажите хоть направление, куда копать нужно. Сам не силен в БД, да вообще толком их не знаю, поэтому и не знаю с какого боку подойти к этой проблеме.
Заранее благодарен всем, кто откликнется.
Viper
Отправлено: 01 Февраля, 2010 - 08:15:05
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
для строго определенных данных создаете поля соответственно, а для наград я бы сделал поле типа TEXT и записывал бы туда данные с разделителями.
к примеру поле awards в вашем приведенном примере содержало бы
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Можете использовать нереляционные базы данных.
----- Truly yours, Sasha.
Phantik
Отправлено: 01 Февраля, 2010 - 13:07:47
Посетитель
Покинул форум
Сообщений всего: 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`)
Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009 Откуда: Днепропетровск
Помог: 8 раз(а)
все в одной таблице id имя фамилия и тд. а награды уже в отформатированном виде для вывода записать в поле типа TEXT как было сказано выше, или в тот же TEXT только разобрать награды и через serialized
XelaNimed
Отправлено: 02 Февраля, 2010 - 07:35:12
Частый гость
Покинул форум
Сообщений всего: 136
Дата рег-ции: Сент. 2009
Помог: 0 раз(а)
Всем доброго и продуктивного времени суток.
Я сильно признателен всем, кто откликнулся. Насчет сохранения всех наград в столбце с типом "text"... Проблема то сама не в том чтоб просто сохранить полученные данные, а в том как потом опросить таблицу/ы.
Если я правильно понимаю, то имеется 2 приемлимых варианта.
Первый: сохранить все в таблицу используя разделители;
Второй: все тоже, но с использованием serialize();
Вопрос: как после сохранения вышесказанного составить запрос, который выводил бы к примеру исполнителей имеющих MTV Europe Music Awards? Насколько я понимаю, в случае с serialize() это будет не реально... или?
Phantik пишет:
2) Табл 2 (награды)
id_reward - примари кей награды
name - название награды
Это нереально. Понадобится куча времени, чтоб описать все возможные награды. Причем некоторые из них вообще были вручены единожды. Ищется способ занести в БД данные, причем независимо от названия награды, которые после можно было бы опросить.
P.S.: Читал про индексацию, если честно, то мало чего понял. Знающие люди, подскажите, если в столбец типа "varchar" внести данные содержащие HTML-теги, можно ли будет впоследствии организовать корректный полнотекстовый поиск?
Viper
Отправлено: 02 Февраля, 2010 - 07:47:15
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
XelaNimed пишет:
P.S.: Читал про индексацию, если честно, то мало чего понял. Знающие люди, подскажите, если в столбец типа "varchar" внести данные содержащие HTML-теги, можно ли будет впоследствии организовать корректный полнотекстовый поиск?
что конкретно не поняли?
varchar вам не подойдет, т.к. у него лимит в 256 символов. к тому же для fulltext-поиска лучше тип либо TEXT, либо BLOB.
и ещё момент. если в тексте присутствуют html-теги то без разницы абсолютно, т.к. вы можете их обработать через регулярку в цикле после выборки из БД и убрать.
PS! Если данные с разделителями, то выгребаете нежные данные и потом на php делаете с ними все что угодно. это если не хотите возится, либо не знаете как с сложными структурами БД и вложеными запросами.
насколько я понимаю мне нужно его вносить в базу в столбец типа "text". Подскажите если не трудно, как потом опрашивать таблицу, если на выходе нужно получить список артистов имеющих награду "World Music Award"?
Viper
Отправлено: 02 Февраля, 2010 - 09:12:07
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
XelaNimed да.
опрашивать таблицу простоым SELECT запросом, но дальше вам нужно будет разбирать ту кашу которая приезжает с помощью регулярных выражений.
ИМХО я бы сразу до записи в БД отбрасывал бы html-теги. и база меньше весить будет и более удобоваримо и для вас и для юзера.
" SELECT * FROM table_name WHERE awards LIKE '%World Music Award%' "
Или я что-то недопонимаю?
USB_user
Отправлено: 02 Февраля, 2010 - 09:30:13
Новичок
Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010 Откуда: Киев
Помог: 0 раз(а)
Лучше всего использовать вариант предложенный Phantik,
А в таблицу с наградами Вы проверяете, если такая награда есть,
то просто присваиваете ее ID в табл.3,
а если такой награды еще нет,
то добавляете ее в таблицу,
а после этого вносите запись в табл.3
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.