Проблема с связью таблиц базы данных - PullRequest
1 голос
/ 18 ноября 2010

Положение: У меня есть новости. Новые опубликованы в нескольких категориях.

Проблема: Как хранить отношения между новостями и категориями? Должен ли я создать три таблицы (новости, категории, новости_категории)? Это лучший метод из возможных?

Давайте посмотрим примеры: Я хочу запросить в базе данных последние новости, поэтому мне нужно: 1. запросить новости, используя объединение, чтобы запросить категории новостей 2. в цикле запросите имя категории.

Итак, у меня 10 новостей (10 запросов) X количество категорий = общее количество запросов. Не слишком много?

Обновление
Вот мой пример. Ниже приведены три таблицы.

-- news --  
ID  
Title

-- categories --  
ID  
Name

-- news_categories --  
ID    
NewsID  
CategoryID

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

Обновление 2
Вот мой запрос:

SELECT N.Title, C.Name
  FROM x_news_categories AS NC
    INNER JOIN x_news AS N
      ON N.ID = NC.NewsID
    INNER JOIN x_categories AS C
      ON C.ID = NC.CategoryID

и вот его результат:

Title   Name
Test    PHP
Test2   MySQL
Test2   CSS

У кого-нибудь есть предложения, как решить эту проблему?

С уважением, M.

1 Ответ

0 голосов
/ 18 ноября 2010

Да, три таблицы - это правильная реализация с внешними ключами между новостями, новой категорией, категорией и новой категорией.

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

SELECT N.Title
  FROM news_categories AS NC
    INNER JOIN news AS N
      ON N.ID = NC.NewsID
    INNER JOIN Categories AS C
      ON C.ID = NC.CategoryID
  WHERE C.Name = @Category

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

SELECT N.Title
  FROM news_categories AS NC
    INNER JOIN news AS N
      ON N.ID = NC.NewsID
  WHERE NC.CategoryID = @CategoryID

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

CREATE FUNCTION fnCategoryList
(
    @NewsID INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @CategoryList VARCHAR(1000)
    SET @CategoryList = ''

    SELECT @CategoryList = COALESCE(@CategoryList + ',','') + C.[Name]
        FROM news_categories AS NC
            INNER JOIN categories AS C
                ON NC.CategoryID = C.ID
        WHERE NC.NewsID = @NewsID

    RETURN @CategoryList
END

При использовании вышеуказанного UDF ваш запрос будет выглядеть так:

SELECT Title, fnCategoryList(ID) AS Categories
  FROM news

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...