假设我有一个名为movie\u名人的表,它有以下列:
CREATE TABLE `movie_celebrity` (
`id` int(11) NOT NULL,
`movie_id` int(11) NOT NULL,
`celebrity_id` int(11) NOT NULL,
`movie_celebrity_type_id` int(11) NOT NULL,
`role` varchar(10) DEFAULT NULL,
`character_name` varchar(50) DEFAULT NULL
)
所以如果名人的类型是作家或导演 role
以及 character_name
将为空,仅当类型为actor时,此字段才会被填充。
这真的是个糟糕的设计吗?或者这只是有点低效?
我假设为这两列创建一个单独的表会更好。
编辑(包括架构)
电影表:
CREATE TABLE `movie` (
`id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`poster` varchar(255) DEFAULT NULL,
`release_Date` date NOT NULL,
`runtime` time NOT NULL,
`storyline` text NOT NULL,
`rated` varchar(10) DEFAULT NULL,
`rating` float(2,1) NOT NULL DEFAULT '0.0',
`inserted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
)
名人表:
CREATE TABLE `celebrity` (
`id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`picture` varchar(255) DEFAULT NULL,
`date_of_birth` date NOT NULL,
`biography` text NOT NULL
)
电影明星表:
CREATE TABLE `movie_celebrity` (
`id` int(11) NOT NULL,
`movie_id` int(11) NOT NULL,
`celebrity_id` int(11) NOT NULL,
`type` varchar(10) NOT NULL,
`role` varchar(10) DEFAULT NULL,
`character_name` varchar(50) DEFAULT NULL
)
1条答案
按热度按时间vuktfyat1#
看来你想做一张“演员和工作人员”的组合表。取决于你用它做什么,把它们都放在一张table上可能是个好主意,或者最好有单独的“演员”和“剧组”。我想从一个组合表开始,看看效果如何。如果不成功,可以拆分表并创建一个向后兼容的视图。
根据作者的评论,
movie_celebrity_type_id
是指“作家”或“演员”或“导演”之类的role
代表“领导”或“支持”。这似乎很奇怪。许多电影没有定义“领导”和“支持”的演员阵容。很多名人都是编剧,演员和制片人。阿尔弗雷德希区柯克就是一个很好的例子。你的
movie
以及celebrity
table很好,不过我可能会打电话给他们persons
. 我会这样设计连接他们的table:这不仅仅是一个电影/名人加入表,所以我给它起了一个描述性的名字
cast_and_crew
. 因为其他参赛者中的大多数都是演员character_name
,把它变成一个真正的专栏就好了。这个notes
json列为任何其他数据位提供了灵活性,而无需添加更多的列。例如,艾尔弗雷德·希区柯克在《鸟》中未经认可的出现。。。
insert into cast_and_crew (movie_id, celebrity_id, role)
values(, , 'producer');
insert into cast_and_crew (movie_id, celebrity_id, role)
values(, , 'director');
insert into cast_and_crew (movie_id, celebrity_id, role, noes)
values(, , 'assistant', '{ "to": }');