是的,一切都看起来没问题。但是......
的几个注意事项:
,我们会根据对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