Мне интересно, каков наилучший подход для следующего случая:
Заголовки таблиц
CREATE TABLE `titles` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(220) COLLATE utf8_unicode_ci NOT NULL,
`original_name` varchar(220) COLLATE utf8_unicode_ci DEFAULT NULL,
`country_code` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL,
`category` tinyint(4) NOT NULL,
`year` smallint(5) unsigned DEFAULT NULL,
`plot` text COLLATE utf8_unicode_ci,
`genres` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB
Эпизоды настольных ТВ
CREATE TABLE `tv_episodes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`t_id` mediumint(8) unsigned NOT NULL, # title_id
`season` smallint(6) NOT NULL,
`episode` smallint(6) DEFAULT NULL,
`episode_hash` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`airdate` date DEFAULT NULL,
`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
)
И еще две таблицы: субтитры и subtitle_languages .Из этих таблиц я хочу узнать только, есть ли в ТВ-эпизоде субтитры или нет и на каких языках.
Заголовки могут обновляться каждые 2 недели (рейтинги, сюжет и т. Д.).Эпизоды будут часто обновляться.
Запрос запроса, который я хотел бы получить из данных:
Дайте мне эпизоды с информацией о названии, которые имеют субтитры и имеютжанр Действие, сгруппированное по заголовкам (t_id) по заказу airdate desc.
Я искал 4 возможных отношения, которые мог бы сделать.
Соединения на стороне приложения Два указателя: заголовки / эпизоды.Сопоставление:
// titles
[
't_id' => ['type' => 'integer'],
'name' =>['type' =>'keyword'],
'org_name' => ['type' =>'keyword'],
'slug' =>['enabled' =>false],
'year' => ['type' =>'short'],
'cat' => ['type' =>'byte'],
'country_code' => ['type' =>'keyword'],
'plot' =>['enabled'=>false],
'runtime'=>['type' =>'short'],
'genres_str' =>['enabled' =>false],
'rating' =>['type' =>'short'],
'genres' =>[
'type' =>'nested',
'properties' =>[
'genre' =>['type' =>'keyword'],
]
],
]
// эпизоды
[
't_id' => ['type' => 'integer'],
'episode' => ['type' => 'integer'],
'season' => ['type' => 'integer'],
'episode_hash' => ['type' => 'keyword'],
'airdate' => ['type' => 'date'],
'title' => ['enabled' => false],
'last_updated' => ['type' => 'date'],
// Has subs + languages.
'has_subs' => ['type' => 'byte'],
'languages' => [
'type' => 'nested',
'properties' => [
'l_id' => ['type' => 'integer'],
'name' => ['type' => 'keyword'],
'flag' => ['enabled' => false]
]
]
]
Проблемы :
- Мне нужно запросить дважды, сначала эпизоды изатем получите информацию о названии с помощью t_id.
- Если я хочу узнать эпизод с жанром Action, я застрял .. Или мне нужно будет добавить жанры к каждому эпизоду.
Денормализация данных Проблемы: Для каждого эпизода мне нужно будет добавить информацию о заголовке.Помимо проблемы с накладными расходами (получено 936,953 строки), каждый раз, когда информация заголовка будет меняться, мне нужно будет обновлять каждый эпизод.
Вложенные объекты : Немного та же проблема, если я хочуЧтобы обновить один эпизод, весь источник будет удален / вставлен, некоторые заголовки содержат более 1500 эпизодов.Не проверено, но я могу представить, что это приводит к большим нагрузкам.
[
'name' =>['type' =>'keyword'],
'org_name' => ['type' =>'keyword'],
'year' => ['type' =>'short'],
'country_code' => ['type' =>'keyword'],
...
'episodes' =>[
'type' =>'nested',
'properties' =>[
'e_id' =>['type' =>'long'],
't_id' => ['type'=>'long'],
'episode' => ['type'=>'integer'],
'season' => ['type'=>'integer'],
'episode_hash' =>['type' =>'keyword'],
'airdate' =>['type' =>'date'],
'title' =>['type' =>'keyword'],
'last_updated' =>['type' =>'date'],
]
]
]
Родительские / дочерние отношения : казалось, хороший выбор для этого случая.
[
// title
't_id' => ['type' => 'integer'],
'name' =>['type' =>'keyword'],
...
'genres' =>[
'type' =>'nested',
'properties' =>[
'genre' =>['type' =>'keyword'],
]
],
...
// what type is this... title/episode.
'type' => ['type' =>'keyword'],
// joins...
"joinField" => [
'type' =>'join',
'relations' =>[
'title' =>'episodes'
]
],
// Child , episode.
'e_id' => ['type' => 'long'],
'episode' => ['type' => 'integer'],
'season' => ['type' => 'integer'],
'episode_hash' => ['type' => 'keyword'],
'airdate' => ['type' => 'date'],
// Has subs + languages.
'has_subs' => ['type' => 'byte'],
'languages' => [
'type' => 'nested',
'properties' => [
'l_id' => ['type' => 'integer'],
'name' => ['type' => 'keyword'],
'flag' => ['enabled' => false]
]
]
]
Проблемы: Вы не можете сортировать по has_child , и мне это нужно, если я хочу отсортировать по дате выпуска.Вы можете сортировать по _score, есть ли способ, которым я могу сортировать по полю даты ... как создать счет на основе отметки времени?
Как видите, я немного застрял на том, какой путь выбрать.Какие-нибудь советы?