我正在处理我正在处理的数据库问题,尽管它很简单。我习惯于使用 ORM 为我取消后端 SQL,但这不是一个选项。
我需要创建一个将流派映射到多部电影的数据库。例如,动作将映射到终结者、印第安纳琼斯和尖峰时刻。喜剧将映射到 The Big Lebowski 和 High Fidelity。我知道在一个真正强大的解决方案中,一部电影可以有多种类型,但现在让我们先忽略它。
解决此问题的最佳方法是什么,以便我可以按电影类型查询数据库并接收多部电影的列表?
我正在处理我正在处理的数据库问题,尽管它很简单。我习惯于使用 ORM 为我取消后端 SQL,但这不是一个选项。
我需要创建一个将流派映射到多部电影的数据库。例如,动作将映射到终结者、印第安纳琼斯和尖峰时刻。喜剧将映射到 The Big Lebowski 和 High Fidelity。我知道在一个真正强大的解决方案中,一部电影可以有多种类型,但现在让我们先忽略它。
解决此问题的最佳方法是什么,以便我可以按电影类型查询数据库并接收多部电影的列表?
w3schools教授 sql 基础知识。我肯定会从那里开始。然后您可能想搜索一个 DDL(数据定义语言)教程来学习如何正确创建表 - 每个数据库的语法各不相同。我进行了快速搜索,这看起来很有用:http: //facility9.com/2010/07/postgresql-tutorial-creating-the-pagila-schema/。您不想“忽略”多类型问题,这就是使数据库有用的原因。
对于您的具体情况,基本上您需要一个电影表、一个流派表和一个电影流派表。(您需要更多批量,但这些应该涵盖您问题中的信息。) Movie 包含字段(标题、年份、导演等)中的电影信息,其中一个是primary key。流派表,同样包含流派信息,也有一个主键。魔术发生在具有主键和 2 个外键的电影类型表中字段。一个用于电影主键,一个用于流派主键。例如,如果终结者电影的主键是 1,动作类型的主键是 3,科幻类型的主键是 8,那么您将通过在电影类型中插入 1、3 来添加终结者 <-> 动作的记录表,并通过在表中插入 1、8 来添加终结者 <-> 科幻记录。
然后,您的查询将查看此表以查找哪些电影属于哪些类型(反之亦然),并使用其他两个表来提供冗长的信息。
如果你使用 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
}
现在在控制器中,为了获取包括它的电影在内的流派,请使用以下代码:
public ActionResult Browse(string genre)
{
var genreModel = storeDB.Genres.Include("Movies").Single(g => g.Name == genre);
return View(genreModel);
}
我希望它可以使用 --> Radmehr
这是一个 SQL fiddle 演示: SQL Fiddle
我同意其他人的观点,W3schools 也可以学习基础知识: W3Schooles Learn SQL
If you don't care about joins then the simplest option to create a 3 column table like this:
UID, GENRE, FK_Movie
With FK_Movie obviously being the foreign key to the row in the Movie table. Using this approach you can actually attach multiple genres to the movie. To select the movies by genre simply "Select" the genre and do an inner join....
这是一个多对多的关系。它是通过一个查找表来实现的,其中一个字段用于 CategoryID,一个字段用于 MovieID。您应该获取您感兴趣的类别的ID,然后对查找表和Category="x" 的电影表执行简单的一对多连接类型查询。SELECT * FROM LookupTable 为 LT,电影为 M WHERE LT.Category = "x";
只需简单查找即可获取 CatID。这两个查询可以组合起来,但为了简单起见,我在这里只展示第二部分。
创建所谓的关联或多对多表,其中包含两列,一列用于流派,一列用于 MovieId
Create Table MovieGenres(
Genre varchar(10),
MovieId integer Not Null,
Primary Key (Genre, MovieId)
)
现在每部电影都可以有零到多个流派,一个流派可以用于零到多部电影。