0

すべてのテーブルに主キー用の 2 つの列があるデータベース構造があります。

たとえば、テーブル Author には、自動インクリメント番号である AutherId と、その pc に固有の pc_id のような 2 つの列があり、これらはテーブルの複合キーです。しかし、関係に関しては、すべての関係に対して両方の列を定義する必要があります。Docrtine (PHP ORM) を使用する予定なので、そのように使用するのは少し問題があります。

したがって、一意の ID (pc_id も組み合わせて) を生成し、それを主キーとして使用できるかどうか疑問に思います。

PHP コードは time() のようなものです。ランド(1000,9999) . $pc_id

time + 1000 から 9999 までの乱数と pc_id (pc_id も 1 から始まる数値) を連結して ID が生成されるようにします。しかし、これは 20 桁の数字 (pc_id が 6 桁の場合) を作成し、bigint を格納する必要があります

これに代わる良い方法はありますか

よろしく

4

3 に答える 3

2

この目的でビジネス情報を使用する代わりに、DB で主キーを自動生成することをお勧めします。

もちろん、一意性を強制したい場合は、ビジネス情報に制約を設けることができます。しかし、このようにして、外部キーなどで発生する問題を回避できます。

つまり、主キーを生成し、ビジネス価値に対する一意の制約を取得します

于 2010-04-26T09:53:49.857 に答える
1

作成者テーブルに必要な主キーは 1 つだけです (AuthorId)。同じ ID を持つ 2 人の著者が存在するのはなぜですか? 多数の pc と author の関係がある場合は、PcId の主キーと AuthorId のフィールドを持つ別の pc テーブルを用意します。

于 2010-04-26T09:53:04.927 に答える
0

代理キーとしてUUIDを使用できます。これは、すべてのサーバーでグローバルに一意です。欠点は、36バイトの文字列であるため、手動で渡すのは扱いにくい場合があることです。

条件を満たすことができる場合は、UUIDの64ビット整数表現であるuuid_short()もありますが、文字列UUIDの128ビットの半分をドロップするため、グローバルに一意であると見なす方法とタイミングに特定の制限があります。 「bigintunsigned」フィールドに押し込むことができます。

于 2010-04-26T16:23:36.307 に答える