在这个mysql示例中只有一列必需的主表吗?

时间:2010-10-17 12:46:22

标签: mysql database-design

我有一个mysql数据库,其中包含一个表,其中包含多个其他表的版本信息。为了链接到同一版本的系列,我有一个version_master表,它包含链接引用的版本系列的主键。我想知道是否有一个更优雅的解决方案,而不需要version_master表。

CREATE TABLE IF NOT EXISTS `version` (
`version_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`version_master_id` int(10) unsigned NOT NULL,
`major` int(10) unsigned NOT NULL DEFAULT '0',
`minor` int(10) unsigned NOT NULL DEFAULT '0',
`patch` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`version_id`));

CREATE TABLE IF NOT EXISTS `version_master` (
`version_master_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY);

CREATE TABLE IF NOT EXISTS `needs_versions` (
`needs_versions_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`name` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
`description` text COLLATE utf8_unicode_ci NOT NULL,
`version_master_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`needs_versions_id`));

2 个答案:

答案 0 :(得分:2)

在此示例中,您当然可以删除version_master表,并使用version_idversion_master_id字段的组合作为索引。我想你可以放弃它,因为似乎没有任何东西用外键引用它。

但是,如果您有与每个版本系列相关的其他信息,那么version_master将是一个好主意。

此外,您正尝试从未定义的列offer_type_id中创建主键。目前尚不清楚您是否可以将needs_versionsversion_master逻辑合并。名称本身不是很具描述性。我建议不要在表名中使用动词。

答案 1 :(得分:1)

另一种常见的方法是使用SEQUENCE。

但MySQL似乎不支持它们,至少MySQL manual包含一个关于如何使用一行一列表模拟序列的部分:

  

创建一个表来保存序列   反击并初始化它:

CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);
     

使用该表生成序列   像这样的数字:

UPDATE sequence SET id=LAST_INSERT_ID(id+1);
SELECT LAST_INSERT_ID();