Таблица SQL с одним столбцом, столбец является идентификатором - это безумие? - PullRequest
6 голосов
/ 26 июня 2011

Я проектирую базу данных, которая будет использоваться для интернационализированного контента.Одной из функций является система тегов, похожая на ту, что у Stack Overflow.Вот что у меня есть:

TABLE tags
tag_id | int(11) unsigned | NOT NULL   | PRI | auto_increment 

TABLE tag_translations
| tag_translation_id | int(11) unsigned | NOT NULL   | PRI | auto_increment 
| fk_language_id     | int(11) unsigned | NOT NULL   | MUL |                
| fk_tag_id          | int(11) unsigned | NOT NULL   | MUL |                 
| tag_name           | varchar(255)     | NOT NULL   | UNI |  

TABLE tag_relationships
| tag_relationship_id | int(11) unsigned | NOT NULL   | PRI | auto_increment
| fk_tag_id           | int(11) unsigned | NOT NULL   | MUL | 
| fk_solution_id      | int(11) unsigned | NOT NULL   | MUL |  

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

Ответы [ 3 ]

2 голосов
/ 26 июня 2011

Как я уже сказал в своих комментариях к ОП, у меня была точно такая же проблема несколько лет назад.Я использовал SQL Server, а не MySql, но проблема была та же.

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

1 голос
/ 27 июня 2011

Q1: Нет. Я не вижу смысла таблицы tags.Кажется, ничего не значит.Если вы не можете объяснить семантическое значение строки в этой таблице (что представляет запись в этой таблице в реальном мире?), То, вероятно, она не принадлежит.Я подозреваю, что это только там, чтобы дать вам auto_increment, который не был бы хорошим ответом.Вы можете назначить свои собственные идентификаторы.

Q2: уже ответил.

Я также не вижу, для чего нужны tag_translation_id и tag_relationship_id.Обычное использование auto_increment?

Я думаю, что я бы сделал для базовой структуры:

create table tag_translations (
  tag_id int not null,
  language_id int not null,
  tag_name varchar(255),
  primary key (tag_id, language_id)
);

create table tag_relations (
  tag_id int not null,
  solution_id int not null,
  primary key (tag_id, solution_id)
);

К которой я бы добавил метаданные и индексы по мере необходимости.Два индекса столбцов очень хороши для соединений, таких как tag_relations, потому что серверная оптимизация «Использование индекса»:

Использование индекса

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

Кстати, для интернационализированных систем 255 не является магическим числом для длины поля varchar, если только вы не 'придерживаться однобайтовых кодировок.Если вы используете UTF-8, посмотрите руководство и подумайте, особенно если вы собираетесь проиндексировать этот столбец.

0 голосов
/ 26 июня 2011
INSERT INTO tbl_name () VALUES(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...