2

少しだけアドバイスを求めています。

すべてを読みたくない人のための要約: auto_increment カラムを 1 つだけ持つテーブルを作成することは合理的な考えですか?

詳細:

私は通常、データベースで複数の言語を管理し、オブジェクトのデータとその言語での説明を別々のテーブルで管理しています。例えば:

Table: MyObject (id auto_increment, height, width, depth. PK = id)
Table: MyObjectDescription (id, language, description. PK = id, language)

2 つの id フィールドが対応しているため、次のようなデータがあります。

MyObject
+----+--------+-------+-------+
| id | height | width | depth |
+----+--------+-------+-------+
|  1 |     10 |    10 |    20 |
|  2 |      5 |     6 |     7 |
+----+--------+-------+-------+

MyObjectDescription
+----+----------+-----------------+
| id | language | description     |
+----+----------+-----------------+
|  1 | EN       | First object    |
|  1 | IT       | Primo Oggetto   |
|  2 | EN       | Second object   |
|  2 | IT       | Secondo Oggetto |
+----+----------+-----------------+

私の問題は、説明以外にデータがない特定のデータベース オブジェクトがあることです。

たとえば、カテゴリは、id とテキストの説明として単純に定義されます。MyObjectDescription テーブルのような単一のテーブルを使用することもできますが、auto_increment 列を利用できないため、ID を自分で生成する必要があります。これにより、競合状態エラーテーブル ロックの問題が発生する可能性もあります。または、単一の auto_increment 列を持つ MyObject のような別のテーブルを使用することもできます...

私の疑問は次のとおりです。シーケンスをシミュレートするためだけに単一の列を持つテーブルを使用するのは合理的な考えですか? それともただのバカですか?私のフレームワークには、オブジェクト テーブルを説明テーブルに自動的に結合するロジックが含まれていることにも注意してください。

入力/アイデアをありがとう。

ガレス

4

1 に答える 1

1

を使用しMyObject (id)ます。

id これらのオブジェクトをデータベースの残りの部分から分離していない限り、単独で構成される PK が必要になるため、FOREIGN KEY で参照できます。

分離した場合でも、キーの強制は別のテーブルを正当化します。それがなければ、id同時トランザクションがid別のオブジェクトに対して同じものを生成するのを防ぎながら、どうにかして新しいものを生成する必要があります。それを行う明白な方法は、テーブル全体をロックする (そして MAX+1 を選択する) ことですが、それはスケーラビリティを破壊します。別のテーブル、IMO を用意することをお勧めします。それを InnoDB の下にクラスター化すると、とにかく単一の B ツリーになります。

于 2013-01-31T15:49:45.197 に答える