2013-02-19 1 views
2

Я работаю на веб-сайте, где пользователи могут размещать статьи с этой структурой таблицы:MySQL «любит» Структура таблицы

CREATE TABLE IF NOT EXISTS `articles` (
    `id_articles` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `id_users` int(10) unsigned NOT NULL, 
    `articles` text NOT NULL, 
    PRIMARY KEY (`id_articles`), 
    UNIQUE KEY `id_articles` (`id_articles`), 
    KEY `id_users` (`id_users`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

Каждый пользователь может «как» статьи.

Это правильный путь ниже, чтобы создать «как таблицу»:

CREATE TABLE IF NOT EXISTS `articles_likes` (
    `id_articles` int(10) unsigned NOT NULL, 
    `id_users` int(10) unsigned NOT NULL, 
    KEY `id_articles` (`id_articles`,`id_users`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

да хорошо выглядит .. но я бы сделал сложный первичный ключ с 'id_articles' и' id_users', так что вам может понравиться только одна и та же статья. – bitWorking

+0

Перед добавлением «like» я также могу проверить, находятся ли id_articles и id_users в этой таблице. – Chris

+0

да, вы можете ... но вы никогда не знаете, как данные попадут в db в ближайшее время или позже (webservice и т. д.). И с первичным ключом вы можете быть уверены, что никогда не будет двойных записей. – bitWorking

ответ

2

Это действительный путь Крис. Вы можете использовать COUNT(), чтобы соответствовать id_articles в таблице articles_likes по текущей статье, которую вы просматриваете в articles.

$articles_id = 23; 

mysql_query("SELECT COUNT(*) FROM articles_likes 
WHERE id_articles = ".$articles_id); 

Вы также можете просто оставить COUNT() (MySQL), и сразу же узнать, какие пользователи являются «Те, кому нравится» из статей и подсчета использования() (PHP) на возвращаемом массиве, чтобы дублировать эффект COUNT() в MySQL.

+0

Спасибо за t его ответ :)) – Chris

0

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

+0

То, как сказано выше Крисом, не требует, чтобы пользователи размещали статьи, чтобы выразить «как» в статьях. Способ привязки отношений, основанных на FK, хорош при написании ошибочного кода tho :). Может быть, добавьте пример, чтобы он смоделировал его таким образом;) – 2013-02-19 14:33:19

1

Это правильно, но вы захотите добавить индексы separte на id_articles и id_users (также вы можете назвать столбцы id_article и id_user «за здравомыслие»).

CREATE TABLE IF NOT EXISTS `article_likes` (
    `id_article` int(10) unsigned NOT NULL, 
    `id_user` int(10) unsigned NOT NULL, 
    KEY `id_article` (`id_article`), 
    KEY `id_user` (`id_user`) 
) ENGINE=InnoDB; 

Причина вы хотите отдельные индексы, потому что в MySQL, если вы создаете индекс для столбцов (A, B), что индекс будет использоваться в запросах, имеющих в колонке где пункт А, или столбцов A и B. В вашем случае, например, если вы сделали запрос «SELECT * FROM article_likes WHERE id_user = X», этот запрос не будет использовать индекс. Лучшим вариантом было бы добавить объединенный индекс и отдельный индекс во втором столбце из объединенного индекса. Как это:

CREATE TABLE IF NOT EXISTS `article_likes` (
    `id_article` int(10) unsigned NOT NULL, 
    `id_user` int(10) unsigned NOT NULL, 
    KEY `id_article_user` (`id_article`, `id_user`), 
    KEY `id_user` (`id_user`) 
) ENGINE=InnoDB; 

Таким образом, вы бы оптимальную производительность запросов, таких как 'WHERE id_user = X', «WHERE id_article = X», "WHERE id_article = X И id_user = Y"

+0

Спасибо @Tiberiu за добавление этого ответа :)) – Chris

+0

О вашем синтаксисе KEY 'id_article_user' (' id_article', 'id_user'), почему вы использовали' id_article_user', а не 'id_article'? – Chris

+0

Потому что это сложенный индекс. Если бы я назвал его id_article, разработчик мог бы подумать, что это индекс только в столбце id_article, который не является истинным. –

 Смежные вопросы

  • Нет связанных вопросов^_^