【问题标题】:model associations between movies, actors, directors... etc in CakePHPCakePHP 中电影、演员、导演等之间的模型关联
【发布时间】:2011-06-14 21:53:08
【问题描述】:

我正在尝试找出设置表/模型关联的最佳方式。

我有一张movies 的表格。每部电影可以有零个或多个演员、导演、出版商、作家……等等。

如果我为每种类型的人使用不同的表格/模型,我可以很好地设置它……但这似乎不干净。

我的想法是使用People 模型/表,HABTM 为PeopleType,HABTM 为Movie

这可以很好地将特定的人与一部电影联系起来,但是......像克林特伊斯特伍德这样的人呢 - 他会成为一部电影的导演,另一部电影的演员,甚至可能两者兼而有之。电影如何知道它指的是哪种类型?

只是想不出最好的方法来做到这一点。

【问题讨论】:

    标签: database-design cakephp associations cakephp-1.3


    【解决方案1】:

    另一种方法:

    people_types (id, name)
    people_details (id, first_name, last_name, ....)
    people (id, person_details_id, person_type_id)
    movies_people(id, person_id, movie_id) 
    movies (id, title, ...)
    

    【讨论】:

    • 为什么这会比相同的东西减去“people_details”表更好?我很困惑为什么我要将细节与人员表分开 - 似乎有点矫枉过正?
    • 因为克林特伊斯特伍德既是演员又是导演。如果在此示例中不使用 people_details 表,则需要在 people 表中具有 first_namelast_name 列。因此,您将有两个 Clint Eastwoods 行,它们具有完全相同的 first_namelast_name 列 - 一个作为演员,另一个作为导演。那将是数据重复。
    • 啊!我认为这是有道理的/看起来不错。所以people 表中会有重复,但只有people_details 表的链接(ID)重复,而不是实际数据,对吧?这对我来说更有意义。再次感谢您的帮助。
    • 最终选择了 people_types、people_details、people_details_people_types(其中包含 movie_id)
    【解决方案2】:

    由于一个人可以是一部电影的导演和另一部电影的演员,因此您使用“人员类型”的方法似乎并不好,因为您的 people 表将包含属于多个人的每个人的重复信息 我会创建一个表people_details 和每个类型directorsactorspublishers 等的特定表,外键指向people_details 表。 directorsactorspublishers 表也将包含仅针对相应类型的人的任何列。

    总之,Actor 属于PersonDetailsDirector 属于PersonDetailsActorHABTM MovieDirectorHABTM Movie

    【讨论】:

    • 要么我不理解你,要么你误解了我说的话。在我的示例中,人员表中不会有重复。 HABTM 表“people_people_types”将包含一个“person_id”和一个“people_type_id”,它们希望一个人拥有 1 个或多个 people_types。另外 - 你能解释一下为什么你认为当每个人都有相同的数据时为每个人类型都有一个表格会更好?这似乎比迄今为止提到的任何内容都重复。在您的示例中,像克林特伊斯特伍德这样的人不会在 2 张不同的桌子(或更多桌子)中占据一席之地吗?
    • 我误会了你。但尽管如此,我的回答是有效的。由于实现和理解的简单性,最好为每种类型都有一个表。不会有重复,因为任何重复的(在不同的人类型中)列都应该在people_details 表中。克林特伊斯特伍德的详细信息将在people_details 表中。 actors 表将有一条记录,person_details_id 指的是 people_details 表中 Clint Eastwood 的 id。 directors 表会有一条记录,person_details_id 指的是 people_details 表中 Clint Eastwood 的 ID。
    • 所以,没有数据重复,只有外键。看看agiledata.org/essays/mappingObjects.html#MapEachClassToTable
    • 好的...所以我终于明白了你告诉我要做的事情 - 显然其他人喜欢你的回答(+1 评分) - 你能再解释一次为什么更好,因为这会在我的数据库中添加 6-8 个额外的表,这对我来说似乎是倒退的逻辑。
    • 您的问题没有一个正确答案。你可以通过不同的方式实现你想要的。您将自己决定使用哪种方法。在 Cakephp 中维护修改的(通过添加额外的列)连接表 movies_people 很复杂。
    【解决方案3】:

    在您的联接表中: 电影人

    您可以为“角色”之类的内容添加一个额外的字段。您将在哪里具体说明该电影中的人物功能。然后,您可以将客户 Eastwood 两次添加到联接表中,一次针对他在该电影制作中的每个角色。

    【讨论】:

    • “角色”只是一个字符串,还是 'people_types' 的 id?
    • 我可能会将 people_types 重命名为 role,因为一个人可以充当多个 people_type 会让人感到困惑。如果我正确理解您的问题,角色似乎更有意义。一个人可以在电影制作中扮演 0 个或多个角色。
    • 我想我的问题更多是关于关联而不是字段名称。 “角色”字段应该是人员类型的 id 还是字符串? (我认为应该是 ID)
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多