是的,一切都看起來沒問題。但是......
的幾個注意事項:
,我們會根據對gender
列較短的數據類型;我沒有看到我們需要255個字符來表達這一點。 (強制執行的最大行數有限制。)如果只有少數值,我們會考慮ENUM
數據類型。
我們也可能會在其中幾個列上添加NOT NULL
約束,例如heroname,firstname,lastname。我們也可能會添加DEFAULT ''
。有時,我們確實需要允許NULL值出於某種原因,但我們儘可能使用NOT NULL
。
我在TEXT
列中猶豫不決。使用TEXT
數據類型沒有任何問題,但我只是懷疑這些可能會「隱藏」一些可能更好地存儲在其他列中的信息。
對於外鍵,我們會指定一個名稱的限制,下面我們使用模式,也有可能添加ON UPDATE CASCADE ON DELETE CASCADE
CONSTRAINT FK_superheroPower_power FOREIGN KEY (powerID)
REFERENCES power(id) ON UPDATE CASCADE ON DELETE CASCADE
有關標識符(表名和列名的注意事項)
我們這樣做的方式,所有表名都是小寫字母。 (我們有一個強制所有表名小寫的MySQL選項集。)我們這樣做是爲了避免不同操作系統/文件系統的不兼容問題(其中一些區分大小寫,有些則不區分大小寫)。
另外,表名是單數。表名的名稱表中的一行表示的名稱。我們也不包括_table
作爲名稱的一部分。
MySQL中的列名從不區分大小寫,但我們也總是使用小寫字母作爲列名。我們不使用「camelCase」列名稱,我們使用下劃線字符作爲分隔符,例如power_id
與powerID
,hero_name
對比heroName
。
隨訪
我的 「筆記」 以上是必須遵循的不是特定規則;這些只是我們使用的模式。
遵循這些模式並不能保證我們會有一個成功的軟件,但它對我們有幫助。
爲了供您參考,我將展示這些表格如何看起來像是我們商店的「第一次剪裁」,作爲另一種模式的例證;這是而不是「正確的方式」,這只是我們作爲團隊解決的「一種方式」。
CREATE TABLE superhero
(id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, hero_name VARCHAR(255) NOT NULL COMMENT ''
, first_name VARCHAR(255) NOT NULL DEFAULT '' COMMENT ''
, last_name VARCHAR(255) NOT NULL DEFAULT '' COMMENT ''
, first_appearance DATE COMMENT 'date superhero first appeared'
, gender ENUM('female','male','other') COMMENT 'female,male or other'
, biography_text TEXT COMMENT ''
, universe VARCHAR(255) COMMENT ''
, PRIMARY KEY(id)
, UNIQUE KEY superhero_UX1 (hero_name)
) ENGINE=InnoDB;
CREATE TABLE power
(id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'pk'
, name VARCHAR(255) NOT NULL COMMENT ''
, description_text TEXT NOT NULL COMMENT ''
, PRIMARY KEY(id)
, UNIQUE KEY power_UX1 (name)
) ENGINE=InnoDB;
CREATE TABLE superheropower
(superhero_id INT UNSIGNED NOT NULL COMMENT 'pk, fk ref superhero'
, power_id INT UNSIGNED NOT NULL COMMENT 'pk, fk ref power'
, PRIMARY KEY(superhero_id, power_id)
, CONSTRAINT FK_superheropower_superhero
FOREIGN KEY(superhero_id) REFERENCES superhero(id)
ON UPDATE CASCADE ON DELETE CASCADE
, CONSTRAINT FK_superheropower_power
FOREIGN KEY (power_id) REFERENCES power(id)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
找出最簡單的方法就是試試看看會發生什麼:-) –
可能更適合代碼審閱 – OneHoopyFrood