是的,那里的一切看起来都还不错。但是……
几点说明:
我们会为 gender 列使用较短的数据类型;我不认为我们需要 255 个字符来表达这一点。 (强制执行的行的最大大小有限制。)如果只有几个值,我们会考虑 ENUM 数据类型。
我们还可能在其中几个列上添加NOT NULL 约束,例如 heroname、firstname、lastname。我们也可能会添加DEFAULT ''。有时,出于某种原因,我们确实需要允许 NULL 值,但我们尽可能使用NOT NULL。
我对@987654326@ 列犹豫不决。使用 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 中的列名从不区分大小写,但我们也总是使用小写的列名。我们不“驼峰式”我们的列名,我们使用下划线字符作为分隔符,例如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;