База данных с различным количеством записей для атрибутов - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь создать базу данных для хранения и запроса моих фильмов и комиксов.Я хочу иметь возможность запрашивать различные (заранее определенные) атрибуты (например, актеры, режиссер, длина).Теперь не в каждом фильме задействовано одинаковое количество актеров, и я не знаю, как это объяснить.

Позвольте привести пример: в фильме «Остров затвора» играют Лео Ди Каприо и Марк Руффало.В начале игры играют Том Харди, Джозеф Гордон-Левитт, Эллен Пейдж, Лео Ди Каприо и Майкл Кейн.В Авиаторе есть только Ди Каприо (не точно, я знаю).

Я мог бы добавить множество атрибутов, таких как актер1, актер2, актер3, ... Но когда я ищу фильмы с Ди Каприо, я не знаю, в каком он актере: 1, актере2 или в каком актере-атрибут, в котором он находится. Тем не менее, с запросом, похожим на SELECT films FROM database WHERE actor = 'Leo DiCaprio' Я хочу получить список со всеми его фильмами в моей базе данных.

Каким будет подходящий дизайн для базы данных?Возможно ли это даже с реляционной базой данных?

Спасибо за вашу помощь.Возможно, awnser очевиден, но я новичок в sql и базах данных и пытаюсь выполнить это в учебных целях.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Вот где светятся реляционные базы данных!Схема, подобная приведенной ниже, дает вам гибкость в поиске и том, что вы можете вернуть.Важная вещь, на которую стоит обратить внимание, - это отношения между многими.Фильм может иметь много кредитов, но один кредит должен принадлежать определенному фильму.Участник может иметь много типов кредитов и фильмов.Они могут даже иметь много ролей в фильме.

Contributor
|---------------------|------------------|------------------|------------------|
|   ContributorID     | FirstName        |  LastName        |  DisplayName     |
|---------------------|------------------|------------------|------------------|
|          1          |      Leo         |  Dicaprio        |  Leo DiCaprio    |
|---------------------|------------------|------------------|------------------|
|          2          |      Kate        |  Winslet         |  Kate Winslet    |
|---------------------|------------------|------------------|------------------|
|          3          |      James       |  Cameron         |  James Cameron   |
|---------------------|------------------|------------------|------------------|

Movie
|---------------------|------------------|
|      MovieID        |  MovieName       |
|---------------------|------------------|
|          1          |   Titanic        |    
|---------------------|------------------|

Credit
|---------------------|------------------|------------------|------------------|
|    CreditID         |  MovieID         |  ContributorID   |  CreditTypeID    |
|---------------------|------------------|------------------|------------------|
|          1          |     1            |  1               |    1             |
|---------------------|------------------|------------------|------------------|
|          2          |     1            |  2               |    2             |
|---------------------|------------------|------------------|------------------|
|          3          |     1            |  3               |    3             |
|---------------------|------------------|------------------|------------------|

CreditType
|---------------------|------------------|
|    CreditTypeID     |  CreditTypeName  | 
|---------------------|------------------|
|          1          |  LeadingActor    |  
|---------------------|------------------|
|          2          |  LeadingActress  |  
|---------------------|------------------|
|          3          |  Producer        | 
|---------------------|------------------|

Вот как вы выполняете свой первоначальный запрос

SELECT MovieName FROM Movie m 
JOIN Credit c ON c.MovieID = m.MovieID 
JOIN Contributor co ON co.ContributorID = c.ContributorID
WHERE co.DisplayName = 'Leo DiCaprio'

Вы также можете найти все титры в фильме

SELECT m.MovieName, c.CreditTypeName, co.DisplayName
FROM Movie m 
JOIN Credit c ON c.MovieID = m.MovieID 
JOIN Contributor co ON co.ContributorID = c.ContributorID
JOIN CreditType ct ON ct.CreditTYpeID = c.CreditTypeID
WHERE m.MovieName = 'Titanic'

Или каждый раз, когда ДиКаприо был ведущим LeadingActor

SELECT m.MovieName, c.CreditTypeName, co.DisplayName
FROM Movie m 
JOIN Credit c ON c.MovieID = m.MovieID 
JOIN Contributor co ON co.ContributorID = c.ContributorID
JOIN CreditType ct ON ct.CreditTYpeID = c.CreditTypeID
WHERE ct.CreditTypeName = 'LeadingActor'
AND co.DisplayName = 'Leo DiCaprio'
0 голосов
/ 09 апреля 2019

Требуется таблица ассоциации (также называемая таблицей junction ) с одной строкой на фильм и каждого актера:

MovieId    ActorId

Затем вы можете перечислить столько актеров, сколько захотите в данном фильме, с каждым актером в отдельном ряду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...