2010-10-17 82 views
2

我有一個包含多個其他表的版本信息的表的MySQL DB。爲了鏈接到相同的版本系列,我有一個version_master表,它包含鏈接引用的版本系列的主鍵。我想知道是否有一個更優雅的解決方案,而不需要version_master表。在這個mysql示例中只有一列需要主表嗎?

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

在這個例子中,你當然可以消除version_master表並使用version_idversion_master_id字段的組合作爲指數。我認爲你可以放棄它,因爲沒有任何東西似乎用外鍵引用它。

但是,如果您擁有與每個版本系列相關的附加信息,擁有version_master將是一個不錯的主意。

此外,您正嘗試從未定義的列offer_type_id中創建主鍵。目前還不清楚您是否可以將needs_versionsversion_master進行邏輯合併。這個名字本身並不是很具描述性。我建議不要在表名中使用動詞。

+0

謝謝。 offer_type_id是複製粘貼錯誤,已更正。 needs_versions表只是幾個表的一個例子,它們都鏈接到版本表以進行版本控制。 – SystemicPlural 2010-10-17 13:10:35

+0

我對使用多列作爲索引不是很熟悉。如何在不自動遞增version_master表的情況下快速創建新的version_master_id。 – SystemicPlural 2010-10-17 13:14:14

+0

爲了回答我自己,我可以使用SELECT MAX(version_master_id)+ 1 FROM版本。只要它被索引,它應該非常高效。 – SystemicPlural 2010-10-17 13:22:23

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(); 
+0

這個解決方案不會麻煩,因爲我必須有一個單獨的表來計算序列。不過,我認爲如果版本變大,它將佔用更少的空間,因爲它只能保存一行。 – SystemicPlural 2010-10-17 13:25:18

相關問題