1

私はデータベースの設計に多大な努力を払ってきましたが、大きな間違いを犯したことに今気づきました。

背景: (背景が必要ない場合は、「問題」にスキップしてください。)

DB は、Web サイト テンプレートのカスタム CMS レイヤーをサポートします。テンプレートのユーザーは、ページのオンとオフを切り替えることができますが、独自の「新しい」ページを作成することはできません。さらに、多くの要素は編集できません。

したがって、ページに編集できるようにしたいテキストがある場合、「手動で」静的 ID を割り当てます。

<h2><%= CMS.getDataItemByID(123456) %></h2>

注: スクリプト言語はこの質問には関係ありませんが、設計上、各テーブルには一意の列名が強制されます。したがって、主キーなどの「TableNameSingular_id」の規則。

スクリプト言語は、これらのテーブルを検索して文字列を見つけます。

mysql> SELECT * FROM CMSData WHERE CMSData_data_id = 123456;
+------------+-----------------+-----------------------------+
| CMSData_id | CMSData_data_id | CMSData_CMSDataType_type_id |
+------------+-----------------+-----------------------------+
|          1 |          123456 |                           1 |
+------------+-----------------+-----------------------------+

mysql> SELECT * FROM CMSDataTypes WHERE CMSDataType_type_id = 1;
+----------------+---------------------+-----------------------+------------------------+
| CMSDataType_id | CMSDataType_type_id | CMSDataType_type_name | CMSDataType_table_name |
+----------------+---------------------+-----------------------+------------------------+
|              1 |                   1 | String                | CMSStrings             |
+----------------+---------------------+-----------------------+------------------------+

mysql> SELECT * FROM CMSStrings WHERE CMSString_CMSData_data_id=123456;
+--------------+---------------------------+----------------------------------+
| CMSString_id | CMSString_CMSData_data_id | CMSString_string                 |
+--------------+--------------------------------------------------------------+
|            1 |                    123456 | The answer to the universe is 42.|
+--------------+---------------------------+----------------------------------+

レンダリングされたテキストは次のようになります。

<h2>The answer to the universe is 42.</h2>

これは、上記の例のような「静的」要素に最適です。ファイル仕様、電子メールアドレス、日付などの他のデータタイプにもまったく同じ方法を使用しました.

ただし、ユーザーがコンテンツを動的に生成できるようにしたい場合は失敗します。

たとえば、「イベント」ページがあり、ユーザーが「イベントの追加」または「イベントの削除」をクリックすることで動的に作成されます。

イベント テーブルは、キーを使用して、次のデータ項目を持つ他のテーブルを参照します。

Data Item:  Table:
--------------------------------------------------
Date        CMSDates
Title       CMSStrings (As show above)
Description CMSTexts   (MySQL TEXT data type.)
--------------------------------------------------

問題:

つまり、イベントが作成されるたびに、CMSData テーブルに次の行を作成する必要があります。

+------------+-----------------+-----------------------------+
| CMSData_id | CMSData_data_id | CMSData_CMSDataType_type_id |
+------------+-----------------+-----------------------------+
|          x |               y |                           6 | (Event)
|        x+1 |             y+1 |                           5 | (Date)
|        x+2 |             y+2 |                           1 | (Title)
|        x+3 |             y+3 |                           3 | (Description)
+------------+-----------------+-----------------------------+

しかし、問題があります。MySQL では、AUTO INCREMENT フィールドを 1 つだけ持つことができます。

CMSData_data_id の最大値を照会してそれに 1 を追加すると、競合状態が発生する可能性があり、他の誰かが最初にそれを取得します。

通常、この問題はどのように解決されますか、またはそもそも回避されますか?

ありがとう、

エリック

4

2 に答える 2

1

ID は、一意であることを除いて、無意味である必要があります。4 つの ID のブロックが連続しているかどうかに関係なく、デザインは機能するはずです。

4 つのブロックとしてではなく、パーツを個別に追加するように実装を再設計します。そうすることで、全体が簡素化され、スケーラビリティが向上します。

于 2013-09-03T16:32:41.227 に答える