我已将一些数据建模到表格中,但隐私是一个非常重要的问题。每当我创建一个新记录时,我都会寻找一个未使用的随机9位数ID。 (这是为了避免任何人能够推断出在最坏情况下创建记录的顺序。)通过伪造id字段,我是否会冒失去数据库性能的风险,因为它无论如何都用于寻址数据?对于SQLite3?这是一个RubyonRails3应用程序,我仍处于开发环境中,所以不确定SQLite3是否会生成。
答案 0 :(得分:1)
CREATE TABLE Bargains
(
RowID INT IDENTITY PRIMARY KEY,
Code AS ABS(CHECKSUM(NEWID())),
CustomerID INT
)
CREATE TABLE Bargains
(
RowID INT IDENTITY PRIMARY KEY,
TheOtherBit VARCHAR(4) NOT NULL DEFAULT(SUBSTRING(CONVERT(varchar(50), NEWID()),
CustomerID INT
)
我们使用NEWID()生成“随机”值,从中取几位数,将其放入SEPARATE字段,并将其合并到用户显示的“漂亮值”中(当用户检索时需要)数据,但内部不需要。)
所以我们有
MyID INT IDENTITY NOT NULL PRIMARY KEY ...
TheOtherBit VARCHAR(4) NOT NULL DEFAULT(SUBSTRING(CONVERT(varchar(50), NEWID())
但在内部对我们来说它会在RowID上订购,当然你也不必随机生成一个数字,用户也不会看到你的RowID ......
这是一些工作代码,用于解释如何在数据库中创建唯一ID
USE TEST
GO
CREATE TABLE NEWID_TEST
(
ID UNIQUEIDENTIFIER DEFAULT NEWID() PRIMARY KEY,
TESTCOLUMN CHAR(2000) DEFAULT REPLICATE('X',2000)
)
GO
CREATE TABLE NEWSEQUENTIALID_TEST
(
ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() PRIMARY KEY,
TESTCOLUMN CHAR(2000) DEFAULT REPLICATE('X',2000)
)
GO
-- INSERT 1000 ROWS INTO EACH TEST TABLE
DECLARE @COUNTER INT
SET @COUNTER = 1
WHILE (@COUNTER <= 50)
BEGIN
INSERT INTO NEWID_TEST DEFAULT VALUES
INSERT INTO NEWSEQUENTIALID_TEST DEFAULT VALUES
SET @COUNTER = @COUNTER + 1
END
GO
SELECT TOP 5 ID FROM NEWID_TEST
SELECT TOP 5 ID FROM NEWSEQUENTIALID_TEST
GO
答案 1 :(得分:1)
较大的ID值不会使索引查找更慢。
存储在数据库文件中的值use fewer bytes较小,但差异不太明显。
为获得最佳性能,您应将ID
列声明为INTEGER PRIMARY KEY
,以便ID
查找不需要单独的索引,但可以将表结构本身用作索引。