一对多关系设计

时间:2013-06-01 02:45:55

标签: sql database postgresql

我正在考虑我正在接受的数据库问题,即使它非常简单。我习惯使用ORM来为我提供后端SQL,但这不是一个选择。

我需要创建一个将流派映射到多部电影的数据库。例如,动作将映射到终结者,印第安纳琼斯和尖峰时刻。喜剧将被映射到The Big Lebowski和High Fidelity。我知道在一个真正强大的解决方案中,一部电影可以有多种类型,但是现在让我们忽略它。

解决此问题的最佳方法是什么,以便我可以按电影类型查询数据库并接收多部电影的列表?

6 个答案:

答案 0 :(得分:1)

w3schools讲授sql的基础知识。我肯定会从那里开始。然后,您可能希望搜索DDL(数据定义语言)教程以了解如何正确创建表 - 每个数据库的语法各不相同。我做了一个快速搜索,看起来很有用:http://facility9.com/2010/07/postgresql-tutorial-creating-the-pagila-schema/。你不想“忽略”多种类型的问题,这就是数据库有用的原因。

根据您的具体情况,您基本上需要电影表,流派表和电影类型表。 (你需要批量更多,但这些应该涵盖你问题中的信息。)电影包含字段(标题,年份,导演等)中的电影信息,其中一个是主键。类型表类似地包含类型信息并且还具有主键。魔术发生在电影类型表中,该表具有主键和2个外键字段。一个用于电影主键,一个用于流派主键。例如,如果终结者电影的主键是1并且动作类型的主键是3,并且科幻小说类型的主键是8,那么你将为终结者添加记录< - >通过将1,3插入电影类型表中并添加终结符< - >通过在表格中插入1,8来科幻小说。

然后,您的查询将查看此表,以查找哪些类型的电影(反之亦然),并使用其他两个表格提供罗嗦信息。

答案 1 :(得分:0)

如果您不关心连接,那么最简单的选项是创建一个3列表,如下所示:

UID,GENRE,FK_Movie

使用FK_Movie显然是Movie表中行的外键。使用这种方法,您实际上可以将多个类型附加到电影中。要按流派选择电影,只需“选择”该流派并进行内部联接....

答案 2 :(得分:0)

以下是您的SQL小提琴演示:SQL Fiddle

我同意其他人的意见,也可以在W3schools上学到基础知识:W3Schooles Learn SQL

答案 3 :(得分:0)

这是一种多对多的关系。它通过查找表实现,该查找表具有CategoryID的字段和MovieID的字段。您应该获取您感兴趣的类别的ID,然后在查找表和类别=“x”的电影表上执行简单的一对多连接类型查询。     SELECT * FROM LookupTable为LT,电影为M WHERE LT.Category =“x”;

只需简单的查找即可获得CatID。这两个查询可以合并,但为了简单起见,我只在这里展示第二部分。

答案 4 :(得分:0)

创建所谓的关联或多对多表,包含两列,一列用于流派,另一列用于MovieId

Create Table MovieGenres(
    Genre varchar(10),
    MovieId integer Not Null,
    Primary Key (Genre, MovieId)
)

现在每部电影都可以有零到多种类型,并且可以在零到多部电影中使用流派。

答案 5 :(得分:0)

如果你使用EF,你可以这样做:

public class Movie
{
    [ScaffoldColumn(false)]
    public int Id {get; set;}
    public string Name {get; set;}
    // ... other movie properties ...

    public virtual Genre Genre{get; set;}
}



public class Genre
{
    [ScaffoldColumn(false)]
    public int Id {get; set;}
    public string Name {get; set;}

    // if you want to Genre has at least on Movie, 
    // add [Required] attribute at top of Movies property
    public virtual List<Movie> Movies {get; set;}  // its used as FK
}

现在在控制器中,为了获得Genre包括它的电影使用下面的代码:

public ActionResult Browse(string genre)
{
    var genreModel = storeDB.Genres.Include("Movies").Single(g => g.Name == genre);

    return View(genreModel);
}

我希望它可用 - &gt; Radmehr

相关问题