为了避免冗余,为了节省空间,出于数据库强度的原因并轻松添加新的可能值,我设计了这个数据库布局:
CREATE TABLE IF NOT EXISTS `tmcc_make` (
`id` tinyint UNSIGNED NOT NULL AUTO_INCREMENT,
`make` varchar(60) NOT NULL UNIQUE,
`status` bit DEFAULT NULL COMMENT 'NULL = active | 1 = deprecated',
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `tmcc_model` (
`id` smallint UNSIGNED NOT NULL AUTO_INCREMENT,
`model` varchar(60) NOT NULL UNIQUE,
`make` tinyint UNSIGNED NOT NULL,
`status` bit DEFAULT NULL COMMENT 'NULL = active | 1 = deprecated',
PRIMARY KEY (`id`),
FOREIGN KEY (`make`) REFERENCES tmcc_make(`id`)
);
CREATE TABLE IF NOT EXISTS `tmcc_vehicle` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`make` tinyint UNSIGNED NOT NULL,
`model` smallint UNSIGNED NOT NULL,
[...]
PRIMARY KEY (`id`),
FOREIGN KEY (`make`) REFERENCES tmcc_make(`id`),
FOREIGN KEY (`model`) REFERENCES tmcc_model(`id`)
);
现在,我知道将描述字段用作前两个表的PK会更容易,这样我就已经准备好了这些值,但这会占用更多的空间。检索匹配id的字符串的最佳和不太复杂的方法是什么?你认为使用更多空间并直接设置字符串而不是整数pk会更好吗?
答案 0 :(得分:1)
我建议您对数据结构进行一些更改。首先,对于不同表中具有相同名称的列(例如model
和make
),不要使用不同的类型。此外,我更喜欢让主键标识实体,因此名称与外键匹配。最后,你应该在make
表中有vehicle
(除非你故意这样做)。该结构是车辆 - >模型 - >使。我建议这个结构:
CREATE TABLE IF NOT EXISTS `tmcc_make` (
`makeid` tinyint UNSIGNED NOT NULL AUTO_INCREMENT,
`make` varchar(60) NOT NULL UNIQUE,
`status` bit DEFAULT NULL COMMENT 'NULL = active | 1 = deprecated',
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `tmcc_model` (
`modelid` smallint UNSIGNED NOT NULL AUTO_INCREMENT,
`model` varchar(60) NOT NULL UNIQUE,
`makeid` tinyint UNSIGNED NOT NULL,
`status` bit DEFAULT NULL COMMENT 'NULL = active | 1 = deprecated',
PRIMARY KEY (`id`),
FOREIGN KEY (`makeid`) REFERENCES tmcc_make(`makeid`)
);
CREATE TABLE IF NOT EXISTS `tmcc_vehicle` (
`vehicleid` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`modelid` smallint UNSIGNED NOT NULL,
[...]
PRIMARY KEY (`vehicleid`),
FOREIGN KEY (`model`) REFERENCES tmcc_model(`modelid`)
);
然后获取结果的查询是:
select v.id, mo.model, ma.make
from vehicle v join
tmcc_model mo
on v.modelid = mo.modelid join
tmcc_make ma
on mo.makeid = ma.makeid;
您可能还希望将status
存储在单独的表中,特别是如果要在两个表中使用相同的值。