0

いくつかのテーブルの MySQL 主キー行の数値 BigInt ID を生成する最良の方法を見つけるための私の探求について。内部時計に頼りたくない。私は自分のサイトの URL がどのように見えるかを気にしていますが、URL に GUID を入れたくありません。

私が考えていたのは、GUID を主キーとして使用することですが、別の列を使用してデータをクエリすることです。その列には、User_Id (INT) + Counter (INT). カウンターは特定のユーザー用であり、挿入するたびにそのカウンターを 1 増やします。

次の URL 構造が必要です。

http://website.com/21474836470099

214748364700 の部分はユーザー ID で、2 番目の部分 '99' はカウンターです。次に、その数値を減算して、その一意の ID (非主キー) 列を照会する選択クエリを作成できます。最後に -99 を使用する可能性があるため、数値全体を bigint として記述する必要がないため、文字列から '99' 値を抽出する方法を知っています。

スケーラビリティと、GUID ではなく URL に数値 ID を含めることに関心があります。繰り返しになりますが、サーバー ID や内部クロックに依存したくはありません。データベースにある情報だけを使用します。さらに、URL を主キーに依存させたくありません

別のオプションは、特定の挿入までボックスの総数を保持する新しい列 BOX_COUNT を作成することです。

元:

ID = 1
BOX_NAME = "name 1"
COUTNER = 1

ID = 5
BOX_NAME = "box 5"
COUNTER = 5

特定のユーザーの新しい BOX が挿入されるたびに 1 ずつ増加する TOTAL_USER_BOXES の列があります。デフォルトでは、各ボックスのカウンターは 0 から始まります。

したがって、次の方法でボックスを選択できます。

SELECT FROM boxes 
WHERE user_id = 214748364700 AND counter = 5

そうすれば、URL は主キーに依存しません。GUID を使用して、さまざまなシャードで行を独立させるようなものです。さらに別のオプションは、user_id + カウンターを主キーとして一緒に使用し、増分 BigInt AI の主キーまたは GUID を破棄することです (おそらく、これが最適であり、スケーラブルでもあります!)

特定のアプリケーションに関する考慮事項:とにかくテーブルを非正規化することを考えているので、結合を行う必要はありません。NoSQL のように使用するため、各ボックス行には項目とそのプロパティを含む列が JSON Like として含まれます。したがって、新しいアイテムを挿入する場合は、データをデシリアライズしてからシリアライズする必要があります。単に挿入するのではなく、+ 変更 + 挿入を選択します。

結果:

次のような URL:http://domain.com/93,22またはhttp://domain.com/92-12

特定の BOX の短い URL で、私の Web ページに ITEMS があり、独立した ID であり、uuid_shrot() やその他のライブラリのようなクロック同期や、一意の ID を作成するための複雑なものに依存していません。

いくつかの提案をお待ちしております。より良い ID をお持ちの場合は、ぜひお聞かせください。ありがとうございました。

4

0 に答える 0