MySQL: система тегов - PullRequest
3 голосов
/ 27 ноября 2011

Предположим, у меня есть таблица, в которой может быть 0 или более тегов:

TABLE: foo
- foo_id (PK)

TABLE: tag
- tag_id (PK)
- name

TABLE: foo_tag
- foo_tag_id (PK)
- foo_id (FK)
- tag_id (FK)

Вопросы:

  1. Выше приведен самый распространенный и простой способ реализации системы теговчто я видел.Я понимаю, что существуют потенциальные проблемы с системами тегов с точки зрения масштабируемости.Я собираюсь получить это здесь?
  2. Есть ли способ сделать что-то подобное в PHP или SQL: вставить новый тег "bar".Если «bar» не существует, добавьте его в таблицу tag и верните последний вставленный идентификатор.Если «bar» существует, не добавляйте его и возвращайте для него tag_id.
  3. Существует ли «правильный» термин БД для такой таблицы, описанной в # 2?

Ответы [ 3 ]

0 голосов
/ 27 ноября 2011

# 2 Я бы установил уникальный ключ в tag.name.Предполагая, что у вас есть автоинкремент tag_id, вы можете попробовать это:

function tagId($tag) {
  mysql_query("INSERT IGNORE INTO tag SET name='$tag'");
  if(mysql_affected_rows()) return mysql_insert_id();
  $result = mysql_query("SELECT tag_id FROM tag WHERE name='$tag'");
  if(!$result) return null;
  $data = mysql_fetch_row($result);
  if($data) return $data[0];
}
0 голосов
/ 27 ноября 2011

Пожалуйста, обратитесь к http://dev.mysql.com/doc/refman/4.1/en/insert-on-duplicate.html для обхода последнего идентификатора при обновлении:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;

Это обновит идентификатор последней вставки до значения обновленного значения.В вашем случае:

INSERT INTO tag (name) VALUES ('bar')
  ON DUPLICATE KEY UPDATE tag_id=LAST_INSERT_ID(tag_id);

tag.name должен быть уникальным ключом.

0 голосов
/ 27 ноября 2011

Если я что-то не пропустил, Если ваша проблема с этой системой тегов # 2 в вашем вопросе, которая вставляет новый тег "bar", если он не существует, попробуйте использовать INSERT IGNORE это пропустит вставку тега, если он существует, и я думаю, что это термин, который вы ищете в # 3 , например:

INSERT IGNORE INTO Tag set name = 'bar';
...