2016-08-09 1 views
1

Я пытаюсь выяснить, какие лучшие практики для ситуации я столкнулся несколько раз за последний год.Использование SQL, какова наилучшая практика для проектирования таблиц, которые ведут себя как интерфейсы для других таблиц?

Для иллюстрации я разработал поддельную базу данных, состоящую из пользователей, фильмов и фильмов, просмотренных пользователями.

enter image description here

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

Итак, я сделал таблицу под названием MovieWatchedMetaData, чтобы действовать как мост между разными таблицами, содержащими метаданные. Предпосылка заключается в том, что эта таблица свяжет первичный ключ из таблицы метаданных, такой как LocationWatched, к определенному случаю просмотра фильма.

Я не уверен в этом подходе, и если это будет вредно в долгосрочной перспективе. Это плохая практика? Есть ли лучший, более подходящий способ сделать это? Как бы вы организовали эти таблицы?

+1

Тот факт, что 'foreign_key_id' не может быть принудительно применен, не говоря уже о том, какую таблицу он должен ссылаться, должен быть индикатором, это не очень хорошая идея. – Uueerdo

+0

Верно, это определенно красный флаг. Я предполагаю, что альтернативой, к которой я пришел, является включение location_id и device_type_id в таблицу MoviesWatched. – Robert

+0

[_Быстрая практика для многих: много_] (http://stackoverflow.com/documentation/mysql/4857/many-to-many-mapping-table). –

ответ

1

Это слишком долго для комментария, поэтому вместо этого я отвечу. Сейчас я печатаю на рабочем столе, но если я получу время сегодня вечером, я вернусь к этому и дам вам ERD, чтобы больше понять это.

Интерфейс к таблице или набору таблиц должен быть почти всегда просто представлением. Это, как говорится, я вижу несколько вариантов:

  1. Создание таблицы мастера метаданных с фильмом случаю Ид и затем идентификатором для каждого типа метаданных вы хотите связать с ним. Вы можете сохранить эти другие типы метаданных в своих собственных таблицах, как вы сейчас это делаете. Если вы хотите отслеживать дополнительные данные, вам нужно добавить столбец в таблицу отслеживания основных метаданных.

  2. Посмотрите на свои метаданные, просто являясь парами ключ/значение, связанными с событием в кино, и просто имея представление для поворота этой таблицы, чтобы ключи становились столбцами, а значения становились строками в этих столбцах. Это дает вам динамический интерфейс к просмотру фильма с произвольными метаданными, если вы не возражаете обновлять свое представление, чтобы разместить дополнительные столбцы, если хотите добавить разные типы метаданных для отслеживания. Если вы не возражаете получать результаты в процедуре вместо представления, вы можете фактически использовать динамический sql для определения того, какие столбцы метаданных должны присутствовать на основе пар ключ/значение для выбранных эпизодов фильма и создания/выполнения вашего сводного запроса на лету вместо необходимости перекомпилировать представление, когда вы хотите добавить колонку.

  3. Зачем вам нужно, чтобы каждая часть метаданных представляла собой свой собственный столбец? Если вы можете получить общую структуру для ваших метаданных (возможно, имя, описание, идентификатор метки времени, значения и фильма), то вы, по сути, получаете кучу строк метаданных, связанных с каждым фильмом, вроде как вы представьте себе, что в блоге может быть несколько тегов, связанных с ним, за исключением того, что в нашем случае тег фактически является объектом с несколькими полями.

+0

спасибо за продуманный ответ. Мне нравится идея использования представлений для агрегирования необходимых мне метаданных. Я могу просто использовать это предложение !! – Robert

1

enter image description here

То, что вы должны рассмотреть, является «хрюкать» фактор добавления нового аспекта данным обзора и «хрюканье» фактор получения данных обратно. Нет ни одного решения (которое я знаю), которое исправит его, поэтому вам никогда не придется изменять ваши запросы.(Хотя рассмотрим возможность использования OO SQL-выражений в PostgreSQL.)

  1. Его можно добавить в поле ПРОСМОТРОВ (это ваша таблица MoviesWatched). Например, время начала просмотра может хорошо вписываться в таблицу просмотра. Это было бы для вещей, которые вряд ли изменят структуру.
  2. Он может быть добавлен как таблица с внешним ключом для просмотра. Например, таблица ViewLocation имеет набор координат. Это имеет отношение 1: 1 к просмотру и, возможно, может зайти в таблицу просмотра. Но сегодня вы можете записать их как координаты GPS. Завтра вы можете добавить отметку или ссылку на страну.
  3. Его можно добавить как ссылку на стандартный список элементов, как это было для устройства. Устройство может просто перечислить простое, универсальное устройство и всю информацию, которую вы хотите отслеживать об этом устройстве. Соединение «многие-ко-многим» соединяет его с просмотром как DeviceUsage (или DeviceUsed) для просмотра. Это было бы для стандартных вещей, которые вы хотите ссылать снова и снова.

Обратите внимание, что Viewer and Movie - это действительно метаданные для просмотра. Это всего лишь частный случай в том, что всегда есть только один из них. (Что делать, если вы хотите записать более одного зрителя на просмотр. На диаграмме, которую я имею, просмотр - это событие, в течение которого один человек смотрит один фильм. Два человека, которые смотрят один и тот же фильм одновременно, будут двумя видами.)

Итак, я бы, вероятно, создал представление базы данных, которое зависает от просмотра, чтобы извлекать и агрегировать любые метаданные. Я бы добавил будущие метаданные к каждому просмотру в зависимости от того, как он соответствует одному из трех критериев выше. Я бы изменил представление базы данных, когда будут добавлены новые метаданные.

Как мой наставник однажды сказал: «Это один из способов». Я подозреваю, что у этого пути есть проблемы в зависимости от окружающей среды. Я полностью ожидаю, что буду пылать. :-) Хотелось бы увидеть другие решения - особенно от знакомого с OO-SQL.

+0

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

Смежные вопросы