假设我有一个名为Category
的ENUM
列和名为Subcategory
的ENUM
列。我有时只想SELECT
就Category
,这就是它们被拆分的原因。如何最好地保持表格中两列之间的完整性?
CREATE TABLE `Bonza` (
`EventId` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`Category` ENUM("a", "b", "c") NOT NULL,
`Subcategory` ENUM("x", "y", "z") NOT NULL,
PRIMARY KEY(`EventId`)
) ENGINE=InnoDB;
但并不是所有的子类别适用于所有类别(比如,"z"
仅与"a"
和"b"
有效),这惹恼我,这个约束没有烤成表的设计。如果MySQL具有某种“对”类型(其中该类型的列可以在该值的前导子序列上索引),那么这不是一个问题。
如果我想维护类别和子类别之间的完整性,我一直坚持在触发器中写入长条件。或者我最好离开它?你会怎么做?
我想最关系导向的方法应该是存储一个EventCategoryId
,并将其映射到一个包含所有有效事件类型对的表中,并在每次查找事件类别的含义时加入该表。
CREATE TABLE `Bonza` (
`EventId` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`EventCategoryId` INT UNSIGNED NOT NULL,
PRIMARY KEY(`EventId`),
FOREIGN KEY `EventCategoryId` REFEFRENCES(`EventCategories`.`EventCategoryId`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
CREATE TABLE `EventCategories` (
`EventCategoryId` INT UNSIGNED NOT NULL,
`Category` ENUM("a", "b", "c") NOT NULL,
`Subcategory` ENUM("x", "y", "z") NOT NULL,
PRIMARY KEY(`EventCategoryId`)
) ENGINE=InnoDB;
-- Now populate this table with valid category/subcategory pairs at installation
我可以做任何事情更简单?这种查找将潜在地花费我在调用代码时的复杂性和性能,因为INSERT
s变成Bonza
,不是吗?
啊,那是一个很好的主意。不需要'EventCategories.EventCategoryId'然后...?我仍然想坚持使用'ENUM',因为我不喜欢有限集合的自由文本,并且这些值实际上不是单个字符。 –