一部のデータをテーブルにモデル化しましたが、プライバシーは非常に重要な問題です。新しいレコードを作成するときはいつでも、未使用のランダムな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()を使用して「ランダム」値を生成し、そこから数桁を取得して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
于 2013-01-26T23:32:32.373 に答える
1
ID値を大きくしても、インデックスのルックアップが遅くなることはありません。
値が小さいほど、データベースファイルに格納されるバイト数は少なくなりますが、違いが目立つことはほとんどありません。
最適なパフォーマンスを得るには、ルックアップに個別のインデックスが必要ないようにID
列を宣言する必要がありますが、テーブル構造自体をインデックスとして使用できます。INTEGER PRIMARY KEY
ID
于 2013-01-27T12:10:01.050 に答える