Реляционные таблицы SQL к индексам ElasticSearch - PullRequest
0 голосов
/ 02 апреля 2019

Мне интересно, каков наилучший подход для следующего случая:

Заголовки таблиц

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]
            ]
        ]
]

Проблемы :

  1. Мне нужно запросить дважды, сначала эпизоды изатем получите информацию о названии с помощью t_id.
  2. Если я хочу узнать эпизод с жанром 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, есть ли способ, которым я могу сортировать по полю даты ... как создать счет на основе отметки времени?

Как видите, я немного застрял на том, какой путь выбрать.Какие-нибудь советы?

...