伪造记录ID导致数据库性能不佳?

时间:2013-01-26 23:09:27

标签: database ruby-on-rails-3 performance sqlite

我已将一些数据建模到表格中,但隐私是一个非常重要的问题。每当我创建一个新记录时,我都会寻找一个未使用的随机9位数ID。 (这是为了避免任何人能够推断出在最坏情况下创建记录的顺序。)通过伪造id字段,我是否会冒失去数据库性能的风险,因为它无论如何都用于寻址数据?对于SQLite3?这是一个RubyonRails3应用程序,我仍处于开发环境中,所以不确定SQLite3是否会生成。

2 个答案:

答案 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查找不需要单独的索引,但可以将表结构本身用作索引。