2009-07-28 54 views
0

我的同事不喜欢自动生成INT序列号由数据库,并要使用像串主键:如何生成数据库串联系列主键

“camera0001” “camera0002”

由于相机可能会被删除,因此我无法使用“相机+1总数”作为新相机的ID。

如果你是我,你将如何在你的程序中生成这种密钥?

PS:我认为自动生成的主要关键字号码是好的,只是不喜欢与同事争吵。

+1

使用字符串作为主键是非常糟糕的做法。字符串比较比整数比较慢几个数量级。然而,就你的问题来说,你使用的是什么数据库服务器?如何或者如何做到这一点的细节取决于服务器。 – Christopher 2009-07-28 15:53:53

+0

我正在使用postgresql。我试图解释说,“camera0001”,“camera0002”...和1,2一样毫无意义...... 但是我的同事们觉得用自动生成的int数来识别相机是很荒谬的。 – ablmf 2009-07-29 04:09:27

+0

这是我自己的评论。我的同事相信我们应该使用指定的全球唯一字符串作为相机的PK。像电话号码一样,它应该包含国家代码,地区号码,子地区号码等等。 同样,我被称为“近视”,因为我不相信有一天我们会连接世界各地数百万台相机。 但我不想被称为“近视”了。让梦想家梦想,我会做他们所要求的。 – ablmf 2009-07-31 09:31:46

回答

1

我不认为序号始终是最好的关键。当有一个自然的主键可用时,我更喜欢它的序列号。例如,如果您的相机是由一些相当短的型号名称或代码标识的,例如您在目录和全部内容中将“Super Duper Professional Camera Model 3”标识为“SDPC3”,那么在我看来,“SDPC3”会是这是主键的绝佳选择。

但这听起来不像你的同事想要在这里做的。他们想要拍摄一个产品类别,即“相机”,当然没有人希望它是独一无二的,然后通过添加序列号来使其具有独特性。这给了你两个世界中最糟糕的东西:很难产生,一个很长的字符串,这使得它处理较慢,但它仍然没有意义:没有人会记住“camera0002904”是蓝色情况下的300万像素相机,而“ camera0002905“是红色外壳的400万像素摄像头。无论如何,没有人会一直记住那类事情。所以你不会把这些值作为有用的显示值给用户。

如果你绝对不得不这样做,我会说做两个领域:一个为类别,一个为序列号。如果他们希望将它们连接在一起进行显示,那很好。最好让序列号在不同类别之间唯一,因此它可以是主键,但是如果需要的话,您可以在类别中分配序列号。 MySQL会自动执行此操作;大多数数据库都会要求你编写一些代码来完成它。 (如果你想讨论如何再次发帖)哦,我不会有任何人输入“相机”的类别。这应该是合法值的查找表,然后将此查找表的主键发布到产品记录中。否则,你将拥有“相机”,“相机”和“camrea”以及其他几十个拼写错误和变体。

0

在您的序列号计数器中添加一个表,将其增加并插入记录。

OR

将ID设置为 '相机' + PAD((RIGHT(MAX(ID),4)+ 1), '0',4)

2

不要做这样“camera0001”!争辩说,这是一个可怕的设计错误。

尝试其中之一:

数据库中的每个列应该只包含1条信息。将ID和类型保留在不同的列中。如果您愿意,您可以将它们一起展示,但不要将它们一起存储!你将不得不不断分裂他们,并使简单的查询困难。该字符串会占用磁盘和缓存内存的大量空间,如果它是FK,则会浪费空间。

具有纯数字自动柱ID和类型列,它是一个外键,它包含一个描述中,类似的表:

表1

YourID  int auto id PK 
YourType char(1) fk 

TypeTable

YourType char(1) PK 
Description varchar(100) 

表1

YourID YourType YourData.... 
1   C  xyz 
2   C  abc 
3   R  dffd 
4   C  fg 

TypeTable

YourType Description 
C   Camera 
R   Radio