структура таблицы новостей. нужна помощь в организации

SID

ReadOnlyТеаm
структура таблицы новостей. нужна помощь в организации

Дано:
2 таблицы
таблица разделов + таблица новостей

структура таблицы разделов.
|id|parent|name|
id - id раздела
parent - id родительского раздела
name - название раздела

структура таблицы новостей.
|id|section|name|text|
id - id новости
section - id раздела в котором хранится новость
name - название новости
text - текст новости

все было хорошо до тех пор пока не появился сайт #2.
т.е. на сайте #2 новости цепляются из таблицы новостей сайта #1
с двумя условиями: одна новость может быть сразу на двух сайтах и у каждого сайта есть свой набор новостей.

первой и самой простой реализацией было добавить в таблицу с новостями новое поле, назовем его предположим site2 в результате вид таблицы новостей стал следующего вида:
|id|section|site2|name|text|

новости добавляются следующим образом:
для сайта #1
id = 1 ; section = 1 ; site2 = 0 ; name = новость ; text = текст новости
для сайта #2
id = 2 ; section = 0 ; site2 = 1 ; name = новость ; text = текст новости
для двух сайтов
id = 3 ; section = 1 ; site2 = 1 ; name = новость ; text = текст новости

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

Собсна вопрос.
Как правельно спроектировать таблицу новостей что бы вне зависимости от количесва сайтов иметь возможность проставлять маркеры к какому сайту относится новость?
Понимаю что для n-ого количесва сайтов можно обойтись легко одним полем указывающим к какому сайту относится новость но вот как реализовать не могу сообразить.
 

XtremallyPurpur

Новичок
Заведи таблицу sites
id|name


таблица новостей будет выглядеть так:
|id|site|section|name|text|

где поле site будет хранить id из таблицы sites
и если это поле будет, скажем, NULL - новость относится ко всем сайтам.

Можно сделать немного сложнее.

Запущенный случай:
У тебя 5 сайтов, 3 из них используют одну новость, 2 - другие. Или типа того.

Тогда твои таблицы будут такими:
sites
id | name
1 first.sample.org
2 second.sample.org
3 third.sample.org
4 forth.sample.org
5 fifth.sample.org

news_rel
site|news
1 | 1
1 | 2
2 | 1
3 | 1
4 | 2
5 | 2

news
|id|section|name|text|
1 | 1 | Блабла | Блабла
2 | 2 | Блабла2 | Блабла2

Таким образом, сайт (1) использует две новости - 1 и 2
сайты (2, 3) используют 1 новость - 1
сайты (4,5) используют 1 новость - 2
 

SID

ReadOnlyТеаm
XtremallyPurpur
думаю оптимальным решением будет использовать второй немного модифицированный вариант.
спасибо за помощь.
зы. осталось теперь только написать скрипт который одну таблицу с новостями в ~18.000 записей разложит по 3 таблицам.

-~{}~ 30.03.06 11:56:

произошло небольшое изменение в структуре таблиц.
собсна как теперь все выглядит.
таблица разделов:
| sid | parent | name |

таблица новостей:
| nid | name | description |

для связи новостей с разделами использую 3ю таблицу:
| news | branch |

зная 'nid' новости мне необходимо получить название раздела к которому относится новость.
по идеи нужно в таблице связей выбрать запись где 'news' = 'nid' из таблицы новостей.
трабл собсна такой, в таблице связей записей у которых " 'news' = 'nid' из таблицы новостей " может оказаться несколько, т.к. новость может принадлежать нескольким разделам.
Вопрос.
Где в своей структуре я допустил ошибку?
 

XtremallyPurpur

Новичок
В таблице новостей нет ключа, который указывает, к какому именно разделу относится новость.

таблица новостей:
| nid | cid | name | description |

где cid - категория новости.
 

SID

ReadOnlyТеаm
XtremallyPurpur
не получится
если добавлю 'cid' в таблице новостей, то таким образом я явно привязывают новость к конкретному разделу.
мне же нужно спроектировать таблицу так, что бы можно было подвязять новость к нескольким разделам.
твой вариант мне в первую очередь пришел в голову но к сожалению оказался не самым удобным для моего функционала.
 

XtremallyPurpur

Новичок
Делай таблицу-связку тогда:

таблица новостей:
| nid | name | description |

таблица разделов:
| sid | parent | name |

таблица-связка
| сid | nid

Совет: почитай что-нибудь про нормализацию.
 

SID

ReadOnlyТеаm
XtremallyPurpur
имея nid новости каким образом мне получить информацию о разделе ? что с чем связывать в запросе?
 

XtremallyPurpur

Новичок
Таблица-связка хранит сведения, к какому разделу (поле cid - идентификатор раздела в таблице разделов) относится новость (поле nid - идентификатор новости в таблице новостей).
 

SID

ReadOnlyТеаm
смотрим что получилось в результате

имеем
таблица новостей:
| nid | name | description |
| 1 |name1| desc1 |
| 2 |name2| desc2 |
| 3 |name3| desc3 |
| 4 |name4| desc4 |

таблица разделов:
| sid | parent | name |
| 1 | 0 | cat1 |
| 2 | 0 | cat2 |
| 3 | 0 | cat3 |
| 4 | 0 | cat4 |

таблица-связка
| sid | nid |
| 2 | 3 |
| 1 | 3 |
| 4 | 3 |
| 1 | 4 |

зная nid новости, например 3 нам необходимо сделать запрос к таблице "таблица-связка" и получить sid раздела. тупик. в результате вместо sid раздела мы получаем массив из 3 элементов а это не правельно.

ps. мне кажется или я правдо начинаю тупеть.
 

XtremallyPurpur

Новичок
Все правильно - ты же сказал, что новость может относится к нескольким разделам.

Новость с идентификатором 3 относится к разделам с идентификаторами 1, 2 и 4.
Новость с идентификатором 4 относится только к разделу с идентификатором 1.
 

SID

ReadOnlyТеаm
гуд. с БД разобрались. теперь осталось разобраться как построить веб морду.
исходя из имеющихся данных талиц разделов и новостей пишем функцию которая выводит дерево.
функция вывода дереве принтует структуру следующего вида:

корень дерева
|
| - раздел#1 (sid#1 | index.php?c=1)
| | - новость#1 (nid#1 | parent sid=1 | news.php?id=1)
| | - новость#2 (nid#2 | parent sid=1 | news.php?id=2)
| | - новость#3 (nid#3 | parent sid=1 | news.php?id=3)
| | - новость#4 (nid#4 | parent sid=1 | news.php?id=4)
|
| - раздел#2 (sid#2 | index.php?c=2)
| | - новость#3 (nid#3 | parent sid=2 | news.php?id=3)
| | - новость#4 (nid#4 | parent sid=2 | news.php?id=4)
|
| - раздел#3 (sid#3 | index.php?c=3)
| | - новость#1 (nid#1 | parent sid=3 | news.php?id=1)
| | - новость#2 (nid#2 | parent sid=3 | news.php?id=2)
|
| - раздел#4 (sid#4 | index.php?c=4)
| | - новость#1 (nid#1 | parent sid=4 | news.php?id=1)
| | - новость#4 (nid#4 | parent sid=4 | news.php?id=4)
|

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

zerkms

TDD infected
Команда форума
SID
в урле наряду с id новости передавай группу
 

SID

ReadOnlyТеаm
в урле наряду с id новости передавай группу
возможен ли вариант при котором не придется изменять урл?
на данный момент в этом плане вижу только одну проблемку, это поисковики. после смены урлов я теряю примерно %98 всей информации( примерно 18.000-19.000 хорошо проиндексированных статей).
 

XtremallyPurpur

Новичок
SID
Задача узнать с какого конкретно раздела юзер попал на страницу с новостью
Только передать ид раздела.
делать открытыми все ветки в которых всречается новость
И в чем проблема, ты же по ид новости можешь вытащить все разделы, в которые входит эта новость.
 

SID

ReadOnlyТеаm
XtremallyPurpur
спасибо тебе, все вопросы решены.
оказалось все не так трудно как казалось сначало. :)
 
Сверху