Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 创建相关表以避免可能的空字段_Mysql_Sql_Database Design - Fatal编程技术网

Mysql 创建相关表以避免可能的空字段

Mysql 创建相关表以避免可能的空字段,mysql,sql,database-design,Mysql,Sql,Database Design,假设我有一个名为movie_名人的表,它有以下列: 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`

假设我有一个名为movie_名人的表,它有以下列:

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
)
因此,如果名人类型为编剧或导演,则角色和角色名称字段将为空,只有当类型为演员时,此字段才会被填充

这真的是个糟糕的设计吗?或者这只是有点低效? 我认为为这两列创建一个单独的表会更好

编辑包含模式

电影表:

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
)
电影明星表:

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
)

看来你想把演员和工作人员组合在一起。取决于你用它做什么,把它们都放在一张桌子上可能是个好主意,或者最好有单独的演员和工作人员。我要说的是从一个组合表开始,看看这是怎么回事。如果不起作用,可以拆分表并向后兼容

根据作者的评论,电影“名人”类型的id是指作家、演员或导演,而角色是指主角或配角。这似乎很奇怪。很多电影都没有定义主角和配角。许多名人都是名人录、作家、演员和制片人。阿尔弗雷德·希区柯克就是一个很好的例子

你的电影表和名人表都不错,不过我可能会称它们为人物。我会这样设计连接他们的桌子:

create table cast_and_crew (
    id integer primary key auto_increment,
    movie_id integer not null,
    celebrity_id integer not null,
    role text not null,
    character_name text,
    credited boolean not null default true,
    notes json not null default '{}'

    foreign key(movie_id) references movie(id),
    foreign key(celebrity_id) references celebrity(id),

    -- Include the character name for people who act in more than one role
    unique(movie_id, celebrity_id, role, character_name)
);
这不仅仅是一个电影/名人加入表,所以我给它起了一个描述性的名字cast_and_crew。因为其他大部分的条目都是演员的名字,所以把它变成一个真正的专栏是很好的。notes为任何其他数据位提供了灵活性,而无需添加更多列

例如,阿尔弗雷德·希区柯克未经认可的出现在

可以编写使用此表的代码来根据角色实例化子类。例如,您可以编写一个通用的CastAndCrew类。然后CastAndCrew::Actor子类将提供一个name方法并要求定义它。CastAndCrew::助手应该知道在notes中查找to字段

另一个例子是被誉为鸟类训练师的雷·伯维克。你们可以把角色设置为“鸟类驯兽师”,但若你们想搜索所有的动物驯兽师呢?你可以有verbatum和normalized角色,verbatum角色是鸟类的驯兽师,normalized角色是动物驯兽师。取决于你想要完成什么


可能会有更多的改进,但这些改进取决于您是否知道如何处理数据。

我认为这是一个糟糕的设计。演员和制作显然是两种不同的东西——不管角色可能由同一个人担任,那么你认为我应该使用完全不同的制作表吗?或者只是将角色和角色名称移动到相关表中?谢谢。好吧,那就是我要做的。哪一个?为角色和角色创建一个不同的表,或者为制作创建一个完全不同的表?我会有一个电影表,一个演员表,还有一个剧组表。还有一桌人-庆祝或其他
insert into cast_and_crew (movie_id, celebrity_id, role, noes)
    values(<The Birds>, <Peggy Robertson>, 'assistant', '{ "to": <Alfred Hitchcock> }');