1

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

4

2 回答 2

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() 生成一个“随机”值,从中取出几位数字,将其放在一个单独的字段中,并将其合并到向用户显示的“漂亮值”中(并且在用户检索数据时需要,但内部不需要)。

所以我们有

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
于 2013-01-26T23:32:32.373 回答
1

较大的 ID 值不会使索引查找变慢。

较小的值在存储在数据库文件中时使用较少的字节,但差异不太可能很明显。

为了获得最佳性能,您应该声明您的ID列,INTEGER PRIMARY KEY以便ID查找不需要单独的索引,但可以使用表结构本身作为索引。

于 2013-01-27T12:10:01.050 回答