字符串作为主键?

时间:2010-11-03 23:02:02

标签: mysql database database-design primary-key

我有这个数据库结构

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 个答案:

答案 0 :(得分:8)

主键适用于数据库。

显示名称适用于最终用户。

不要混淆一个人!不要用有意义的东西制作主键。你迟早会后悔的。

将代理键/身份/自动编号作为主键是一个非常好的主意,并且在数据库设计中被广泛使用。

您可以添加列甚至是DERIVED COLUMN,并在其上添加唯一约束。

答案 1 :(得分:1)

我相信应该那么容易。 但是您需要确定要使用的字符串类型 http://dev.mysql.com/doc/refman/5.1/en/string-types.html

答案 2 :(得分:1)

您的要求不清楚。你怎么得到3个int列的“PS-5678”?您的示例中只有2个组件。

您是否只需要将3个INT转换为单个CHAR()字符串?

如果是这样,数据库很好,根本不需要更改表格!?!?!这三个组件已经可用,正确分离,作为不同的列。您正在寻找的只是将三个组件显示为单个字符串。

答案 3 :(得分:0)

我从您的问题中不清楚您对产品,类别和子类别所做的事情,以制作您的部件号。为了论证,我假设你将它们连接在一起,如产品123,类别456,子类别789给出部件号123-456-789或其他一些。

我喜欢在可行的情况下使用自然标识符作为主键。但“无论何时实际”都可能成为严重的制约因素。如果您的自然标识符是通过某种方式组合其他三个字段得出的,那么您有四种选择:

  1. 使主键成为这三个字段的组合。这往往是一种痛苦。然后,所有联接必须在三个字段上匹配,搜索必须测试三个字段等。

  2. 创建一个新字段,该字段是三个字段的串联,并将其用作priamry键。然后,只要其中一个“基本”字段发生更改,也会更改此连接字段。这是一个非常非常糟糕的主意。不要这样做。它是冗余数据,包含来自冗余数据的所有不良内容。

  3. 用一个组合字段替换三个单独的字段。这比#2更糟糕。现在,当您需要单独的值时,您必须将该字段分开。

  4. 放弃并创建合成密钥,如序列号。使用此作为主键,然后只使用自然键进行显示。如果我的自然键需要连接或以其他方式操纵三个字段,我倾向于使用此选项。

相关问题