Строка в качестве основного ключа? - PullRequest
2 голосов
/ 04 ноября 2010

У меня есть эта структура базы данных

CREATE TABLE `productinfo` (
  `ProductID` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) NOT NULL,
  `ProductImage` varchar(255) NOT NULL,
  `CategoryID` int(11) NOT NULL,
  `SubCategoryID` int(11) NOT NULL,
  `ProductBrief` varchar(255) NOT NULL,
  `Features` text NOT NULL,
  `Specifications` text NOT NULL,
  `Reviews` text NOT NULL,
  `Price` varchar(255) NOT NULL,
  `Status` tinyint(4) NOT NULL,
  PRIMARY KEY (`ProductID`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;

Теперь мне нужно превратить ProductID, CategoryID и SubCategoryID в строку типа Ps-5678 для номера детали.ProductID является первичным ключом, так как мне изменить структуру базы данных.CategoryID и SubCategoryID являются первичными ключами в других таблицах, так как мне справиться с этим ... это так же просто, как превратить

  `ProductID` int(11) NOT NULL AUTO_INCREMENT

в строку ... и избавиться от

  PRIMARY KEY (`ProductID`)

идеи, предложения кто угодно

Ответы [ 4 ]

8 голосов
/ 04 ноября 2010

Первичные ключи предназначены для базы данных.

Отображаемые имена предназначены для конечных пользователей.

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

Наличие суррогатного ключа / идентификатора / автономного номера в качестве первичного ключа является очень хорошей идеей и широко используется при проектировании баз данных.

Вы можете добавить столбецили даже ПРОИЗВОДНАЯ КОЛОННА и добавьте к ней уникальное ограничение.

1 голос
/ 13 ноября 2010

Ваше требование неясно. Как вы получаете "PS-5678" для 3 int колонок? В вашем примере только 2 компонента.

Вам просто нужно конвертировать 3 INT в одну строку CHAR ()?

Если это так, с базой данных все в порядке, менять таблицу вообще не нужно! Три компонента уже доступны, правильно разделены, как отдельные столбцы. То, что вы ищете, это просто отображение трех компонентов в виде одной строки.

1 голос
/ 04 ноября 2010

Я считаю, что это должно быть так просто. однако вам нужно определить, какой тип строки вы хотите использовать http://dev.mysql.com/doc/refman/5.1/en/string-types.html

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

Из вашего вопроса мне не ясно, что вы делаете с продуктом, категорией и подкатегорией, чтобы создать свой номер детали. Ради аргумента я предполагаю, что вы объединяете их вместе, например, продукт 123, категория 456, подкатегория 789 дает номер детали 123-456-789 или что-то подобное.

Мне нравится использовать натуральные идентификаторы в качестве первичных ключей всякий раз, когда это целесообразно. Но «всякий раз, когда это возможно» может быть серьезным препятствием. Если ваш естественный идентификатор получен путем объединения трех других полей, у вас есть четыре варианта:

  1. Сделать первичный ключ комбинацией этих трех полей. Это имеет тенденцию быть болью. Все ваши объединения должны совпадать на трех полях, поиск должен проверять три поля и т. Д.

  2. Создайте новое поле, которое является объединением трех полей, и используйте его в качестве ключа priamry. Затем, когда изменяется одно из «базовых» полей, также меняйте это объединенное поле. Это очень, очень плохая идея. Не делай этого. Это избыточные данные со всеми плохими вещами, которые приходят из избыточных данных.

  3. Замените три отдельных поля одним объединенным полем. Это хуже, чем №2. Теперь, когда вам нужны отдельные значения, вы должны разобрать поле.

  4. Откажитесь и создайте синтетический ключ, например, серийный номер. Используйте это как первичный ключ, а затем просто используйте естественный ключ для целей отображения. Если мой естественный ключ требует объединения или иного манипулирования тремя полями, я предпочитаю использовать эту опцию.

...