私はデータベースの設計に多大な努力を払ってきましたが、大きな間違いを犯したことに今気づきました。
背景: (背景が必要ない場合は、「問題」にスキップしてください。)
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 を追加すると、競合状態が発生する可能性があり、他の誰かが最初にそれを取得します。
通常、この問題はどのように解決されますか、またはそもそも回避されますか?
ありがとう、
エリック