Как мне вернуть файл в состояние «последней регистрации» в Mercurial?

Короткий ответ: перечисления сохраняются как число, поэтому технически вы можете присоединиться к ним с tkSkill как tinyint.

Чтобы использовать его как внешний ключ, вам действительно нужно, чтобы оба tkSkill и level были одним и тем же перечислением, но вам нужно level быть столбцом unique, чтобы квалифицироваться как внешний ключ, поэтому добавьте unique к нему (чтобы быть действительно точным: для InnoDB вы можете иметь неизученные внешние ключи, если вы вручную создаете индекс, но не уникальные внешние ключи, как правило, представляют собой плохую идею). Но вы должны подумать о том, каким должен быть ваш ключ в sklllevel, поскольку теперь он выглядит так, как будто вы хотите Name быть ключом.

И независимо от того, что это ключ, вы должны определить tkSkill как (то же самое) перечисление, чтобы убедиться, что они оба означают одно и то же, если вы в какой-то момент хотели бы изменить перечисления (что плохой идеей!) и, например, добавить еще один уровень навыка; или если вы хотите «прочитать» (прямо понимать) значение, когда вы выбираете непосредственно из таблицы testskill без необходимости присоединения sklllevel; и если вы хотите вставить значения в tkSkill, используя их enum-namoe (например, «Expert» вместо 3, но вы можете использовать оба), не глядя на них в sklllevel.

Более длинный ответ: Best Практика такова: не используйте перечисления. В зависимости от «убеждения» нет ни одного лишь нескольких случаев, когда перечисления могут быть немного полезными, если вообще. Возможно, вы не хотите использовать ссылочную таблицу, чтобы пропустить соединение, чтобы отобразить текстовое значение / описание целочисленного идентификатора. В вашей настройке вы фактически используете справочную таблицу и все еще хотите использовать перечисления.

Ближе всего вы перейдете к передовой практике с использованием перечислений, чтобы определить tkSkill как перечисление в testskill и вообще не иметь sklllevel -table (справочная таблица).

Но опять же я настоятельно призываю вас не использовать перечисления. Вы можете определить свою таблицу как

CREATE TABLE `sklllevel` (
  `Id` tinyint(4) primary key,
  `Name` varchar(20) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

, а затем использовать этот идентификатор в качестве внешнего ключа для tkSkill. Или даже

CREATE TABLE `sklllevel` (
  `Name` varchar(20) primary key
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

, а затем определите tkSkill как varchar(20) и используйте это как внешний ключ - он будет использовать больше места, хотя, но у вас будут «читаемые» значения в таблице, если это послужило основанием для того, чтобы вы сначала использовали перечисления.

Здесь вы можете найти некоторый фон для перечислений: 8 Причины, по которым тип данных ENUM MySQL Evil

28
задан Niall C. 24 April 2012 в 21:13
поделиться