我在我的数据库设计上付出了很多努力,但我认为我是 现在意识到我犯了一个重大错误。
背景:(如果不需要背景,请跳至“问题”。)
数据库支持网站模板的自定义 CMS 层。的用户 模板仅限于打开和关闭页面,但不能创建 他们自己的"new"页面。此外,许多元素是不可编辑的。
因此,如果一个页面有一段文字,我希望他们能够编辑, 我会“手动”为它分配一个静态 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 中,您只能有 1 个 AUTO INCREMENT 字段。
如果我查询 CMSData_data_id 的最大值并只向其加 1,则 有可能存在竞争条件,其他人先捕获它。
这个问题通常是如何解决的——或者首先是如何避免的?
谢谢,
埃里克
最佳答案
id 应该是没有意义的,除非是唯一的。无论 4 个 ID block 是否连续,您的设计都应该有效。
重新设计您的实现以单独添加部件,而不是作为一个 4 block 。这样做应该可以简化整体事情,并提高您的可扩展性。
关于mysql - 如何解决或避免对具有多个 AUTO INCREMENT 列的 MySQL 的需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18559481/