Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Граф в БД, Алгоритмы для работы с графами 
:(
    Опции темы
Mal Hack
Дата 30.7.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Если действительно статей, как в википедии, то можно воспользоваться и одним полем в таблице самих статей. Сделать его строковым, к примеру разделить числа "|", ну и в момент редактирования статьи, если похожая статья добавляется, то ее надо добавить и в добавляемой. При удалении тоже самое. Я бы так сделал вряд ли. Уж на крайний случай сделал так, но в отдельной таблице, где есть поля только ID статьи и seealso.

Тут надо тестировать... 
PM ICQ   Вверх
Sunvas
Дата 30.7.2007, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 2
Всего: 89



А чем отдельная таблица лучше дополнительного поля?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Fally
Дата 30.7.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 17.8.2006
Где: Dahla

Репутация: нет
Всего: 4



Хранить в одном поле информацию, которую затем ещё и парсить, занятие, ИМХО, не из благородных (в отношении к серверу.).. т.к. вместо того, чтобы нормализовать БД вынеся всю схожую информацию в отдельную таблицу и выбирать это 1-2 запросами, Вы будете выбирать информацию, а потом средствами РНР её ещё и парсить... очень много интересеного по поводу древовидных структур в БД и работы с ними можно прочитать здесь.


--------------------
Прежде чем задать вопрос на форуме воспользуйтесь поиском.
user posted image
user posted image
PM MAIL   Вверх
Mal Hack
Дата 30.7.2007, 13:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Sunvas, отдельная таблица - ты покупаешь кухонный стол, а в единой таблице, ты покупаешь стол, тебе дают 20 стульев, 25 сервизов, лампочку и зубную счетку, и спрашивается а нафига мне напильник, если  не курю.
PM ICQ   Вверх
Sunvas
Дата 30.7.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 2
Всего: 89



Fally, проблем с парсингом нет. Тут один хороший человек показал как сделать все красиво. Mal Hack, интересно объяснил. )


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Golda
Дата 31.7.2007, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: 6
Всего: 42



Mal Hack, объяснение - супер  smile 

Кстати, Вы, фактически, повторили мою идею, и к дереву Ваш последний вариант отношения не имеет, т.к. не гарантируется ни связаность графа, ни отсутсвие циклов. Рассмотрите, например, вариант,

(1, 2, 3), (4,5) - где в каждых скобках - набор попарно связанных статей. Это никак не дерево.

Добавлю также, что если сделать сочетание (id1, id2) - первичным ключом, и выработать соглашение, благодаря которому пары всегда будут записываться в одном и том же порядке (например, id1 - всегда меньший, id2 - всегда больший, то и дополнительные запросы для проверки целостности не понадобятся. Ну и не забыть сделать для каждого из полей id1, id2 - внешний ключ с ON DELETE CASCADE, чтобы не заботиться о том, что будет со связями при удалении.

Sunvas, хранение нескольких значений в одном поле противоречит одному из ключевых принципов построения реляционной базы данных: атомарности полей таблиц. DB. Вы теряете на этом возможность переложить на базу данных часть забот о ее целостности и усложняете себе жизнь при составлении всевозможных запросов, кроме, может быть, одного, заранее выбранного. Вариант, при котором ребра хранятся отдельно от вершин, если проставлены все нужные ключи, дает Вам больше гарантий целостности базы и, думаю, должен положительно сказаться на быстродействии при выборе статьи. Вам ведь на самом деле, наверное, не id связанной статьи в базе нужно  показать, а какие-то другие ее поля (название, например).
Значит, понадобятся два запроса: одним выбирает seealso, а дальше в PHP нужно составлять второй запрос типа 

Код

$sql = ".. AND id IN ($seealso)";


В случае же, о которым писали Mal Hack и я, несложно сделать все на уровне SQL, не прибегая к помощи PHP.

Код

SELECT a.title
FROM article AS a INNER JOIN relations AS r ON a.id = r.id1 OR a.id = r.id2
WHERE r.id1 = 5 OR r.id2 = 5


Но даже, если Вы не потратили впустую первый запрос, выбрав в нем все остальные данные о статье, конструкция IN в запрросе - не самая быстрая. Посмотрите, недавно Sta1ker приводил данные своего тестирования для MySQL. http://forum.vingrad.ru/forum/topic-165156.html

Подумайте о том, что усложняются и все остальные операции: добавления, удаления статей, выбора всевозможной статистики. Вы лишаете себя возможности сделать что бы то ни было, связанное с полем seealso, одним запросом.


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.