powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектрование базы для новостей
13 сообщений из 13, страница 1 из 1
Проектрование базы для новостей
    #36857151
Ромс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил сделать свою cms (php+mysql) для простенького блога. Но возник вопрос по проектированию базы данных для новостей и рубрик к которым новости могут относится. Одна новость может быть в нескольких рубриках, и много новостей может быть в одной рубрике, т.е. связь много к много.

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

Решил отталкиваться от трёх таблиц:
первая, таблица новостей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
mysql> select * from news;
+----+--------+
| id | title  |
+----+--------+
|   1  | pervyj |
|   2  | vtoroj |
|   3  | tretij |
+----+--------+

вторая, таблица рубрик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
mysql> select * from categories;
+----+--------------+
| id | name         |
+----+--------------+
|   1  | pervaja      | 
|   2  | vtoraja      | 
|   3  | tretja       | 
|   4  | chetviortaja | 
|   5  | pjataja      | 
+----+--------------+

и третья, связывающая две предыдущих таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
mysql> select * from conn;
+-----+-----+
| nid | cid |
+-----+-----+
|    1  |    1  | 
|    1  |    2  | 
|    1  |    4  | 
|    2  |    3  | 
|    2  |    4  | 
|    3  |    2  | 
|    3  |    5  | 
+-----+-----+
nid - id новости, cid - id рубрики


Теперь, выборкой получаем данные новостей, а так же стринг id рубрик, к которым каждая новость относится.
Код: plaintext
1.
2.
3.
SELECT news.id,title,group_concat(cid) as cats FROM news
JOIN conn
ON news.id=conn.pid
GROUP BY news.id;

Получаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
+----+--------+-------+
| id | title  | cats  |
+----+--------+-------+
|   1  | pervyj |  1 , 2 , 4  | 
|   2  | vtoroj |  3 , 4    | 
|   3  | tretij |  2 , 5    | 
+----+--------+-------+

Остаётся сделать один запрос для получения всех рубрик (SELECT id,name FROM categories;), и далее в цикле выводим на странице каждую новость, а стринг id рубрик разбиваем на массив (explode) и в цикле пишим название рубрики взависимости от id из массива (т.е. из уже разбитого стринга).

Скажите на сколько такой вариант верный? Какие есть другие варианты?
Может есть какая-нибудь статья об этом?

Следующим шагом будет добавление меток, связь тоже много к много.
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36857173
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РомсРешил сделать свою cms (php+mysql) для простенького блога...
Зачем? Чем неустраивают уже существующие? Вы уверены что Ваше творение будет лучше и функциональнее уже существующих?
Невижу смысла изобретать велосипед. Надеюсь и Вы это поймете.
)))
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36857289
Ромс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой БобрРомсРешил сделать свою cms (php+mysql) для простенького блога...
Зачем? Чем неустраивают уже существующие? Вы уверены что Ваше творение будет лучше и функциональнее уже существующих?
Невижу смысла изобретать велосипед. Надеюсь и Вы это поймете.
)))
Чтобы получить опыт в программировании.
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36857423
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РомсЧтобы получить опыт в программировании.
Опыт нужно получать на действующих системах а не лепить сферического коня в ваккууме. Пойдите на сайты фриланса. Там достаточно работы как раз для того что б набраться опыта. Хотя самое правильное устроиться на работу падаваном.
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36857447
Ромс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой БобрРомсЧтобы получить опыт в программировании.
Опыт нужно получать на действующих системах а не лепить сферического коня в ваккууме. Пойдите на сайты фриланса. Там достаточно работы как раз для того что б набраться опыта. Хотя самое правильное устроиться на работу падаваном.
И всё же у Вас есть что сказать по теме?
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36859408
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ромс И всё же у Вас есть что сказать по теме?
Вы мыслите правильно. Но если хотите получить максимальную скорость храните в news.categories (к примеру) categories.id в виде строки с разделителями.
По аналогии хранить в рубриках id новостей неправильно, т.к. новостей будет много. Следовательно для того чтобы найти все новости относящиеся к данной рубрике нужно будет проверить на вхождение categories.id в news.categories.
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36859469
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ромс,

почему у новости может быть несколько рубрик?
Привидите пример, пожалуйста, подозреваю, что-то вроде:
спорт-велосипедный спорт и тд? друой вариант7
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36859481
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> первая, таблица новостей:

Есть смысл использовать устоявшиеся конструкции для описания сообщений. Их масса.

> вторая, таблица рубрик:

Та же история. Классификатор - как правило - древовидная структура, а не плоская.

> и третья, связывающая две предыдущих таблицы:

А здесь вопрос не технический, а методологический. Вообще классификация используется для структурирования чего-либо. Чем полнее классификатор, тем удобнее работать с классифицированными данными. Идеальный (или даже просто хороший) классификатор предполагает возможность однозначной классификации.

> Скажите на сколько такой вариант верный?

Если ваша задача - попробовать, нормальный вариант.

> Какие есть другие варианты?

Их масса. Вообще говоря, вы начали с достаточно сложной задачи, не очень подходящей для "набраться опыта". Не знаю ни одного новостного источника, который мог бы служить прототипом эталонной реализации.
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36859649
Ромс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой БобрВы мыслите правильно. Но если хотите получить максимальную скорость храните в news.categories (к примеру) categories.id в виде строки с разделителями.
По аналогии хранить в рубриках id новостей неправильно, т.к. новостей будет много. Следовательно для того чтобы найти все новости относящиеся к данной рубрике нужно будет проверить на вхождение categories.id в news.categories.
Если id категорий будут записаны строкой к каждой новости, то как тогда найти новости из определённой категории? Использовать like чтоли?

ОзверинРомс,

почему у новости может быть несколько рубрик?
Привидите пример, пожалуйста, подозреваю, что-то вроде:
спорт-велосипедный спорт и тд? друой вариант7
Например здоовье и спорт.
Вы предлагаете упростить задачу и сделать свзять один к много (много новостей в одной категории)? Это не выход :(
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36859697
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ромс
Если id категорий будут записаны строкой к каждой новости, то как тогда найти новости из определённой категории? Использовать like чтоли?

Ну правильнее будет использовать IN. Т.е. для поиска распарсить поле news.categories по идентификаторам. Хотя можно использовать и LIKE, только дополняйте строку поиска разделителем который пользуетесь в строке.
Т.е. пишем хранимку в которую передаем значение для поиска а она вернет нам результат или ошибку. При ошибке выдаем нужное сообщение. Какой метод поиска пользовать в хранимке выбирайте сами. Я так думаю что будет правильным попробовать и тот и другой, какой выдаст большую скорость тот и выбрать.
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36860110
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ромс,

ушел бы я от того, что 1 новость может относиться к нескольким рубрикам.


1. select рубрика, новость
в итоге выдаст корректное кол-во новостей в разрезе рубрики , но накопительный итог может быть неверен(1 новость относится к 2м рубрикам, в итоге это 2 новости, если не учеть в запросе)

2. update новость set where рубрикаид = 1
измениn кроме всего прочего новости. у которых >1рубрики + которые относятся к рубрикиид=1, если не учесть

3. delete - тоже самое :) то есть при банальных запросах треубется включать доп условия..

вообщем, ка кто так вижу я это
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36860516
Ромс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Злой Бобр
Ну правильнее будет использовать IN. Т.е. для поиска распарсить поле news.categories по идентификаторам.

Разве IN будет работать в таком случае?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE test (
	`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`name` VARCHAR( 64 ),
	`cats` VARCHAR( 64 ) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO test VALUES(null, 'perv','5,6,8');
SELECT * FROM test WHERE  6  IN (cats);
Делая такую выборку, ничего не находит (это для пробы).
...
Рейтинг: 0 / 0
Проектрование базы для новостей
    #36860719
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ромс,

Я ж вам написал что для использования IN вам необходимо распарсить значение test.cats .
Исходя из вашего примера вы должны строку '5,6,8' представить в следующем виде '5','6','8'. И соответственно если уж ведете поиск то ведите поиск не числа а строки.
В вашем случае это выглядит примерно так:

DECLARE a VARCHAR(64);
SET a='6';
SELECT * FROM test WHERE a IN ('5','6','8')

Надеюсь как представить cats в виде '5','6','8' сами поймете. Воспользуйтесь для этого поиском.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектрование базы для новостей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]