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