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()を使用して「ランダム」値を生成し、そこから数桁を取得して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 KEYID

于 2013-01-27T12:10:01.050 に答える