2

只是在寻找一些建议。

给不想通读的人的总结:创建一个只有一个 auto_increment 列的表是一个合理的想法吗?

细节:

我通常在数据库中管理多种语言,为对象的数据及其语言描述提供单独的表。例如:

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

这两个 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 表这样的单个表,但是我必须自己生成 id,因为我无法使用 auto_increment 列。这也会增加竞争条件错误表锁定问题的可能性。或者,我可以使用另一个像 MyObject 这样的表,它只有一个 auto_increment 列......

我的疑问是:使用具有单列的表只是为了模拟序列是一个合理的想法吗?或者它只是愚蠢的?另请注意,我的框架包含自动将对象表连接到描述表的逻辑。

感谢您的任何输入/想法。

加雷斯

4

1 回答 1

1

使用MyObject (id).

除非您将这些对象与数据库的其余部分隔离开来,否则您将需要由id 单独组成的 PK ,因此它可以被 FOREIGN KEYs 引用。

即使在孤立的情况下,密钥的强制执行也可以证明单独的表是合理的。没有它,您必须以某种方式生成一个新的id,同时防止并发事务id为不同的对象生成相同的事务。明显的方法是锁定整个表(并选择 MAX+1),但这会破坏可伸缩性。最好有一个单独的表,IMO。如果你将它聚集在 InnoDB 下,那无论如何都只是一个 B-Tree。

于 2013-01-31T15:49:45.197 回答