Хобрук: Ваш путь к мастерству в программировании

Составные внешние ключи в Postgres

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

У меня есть два разных типа контента, которые можно отправлять: темы и посты. Каждый из них со своим первичным ключом.

Ко всем этим элементам могут быть прикреплены некоторые носители. В моей медиа-таблице есть столбцы content_type_id и content_id, где тип контента — это ключ в таблице поиска с различными типами контента, а content_id — это первичный ключ в таблице, где хранится этот конкретный фрагмент контента.

Проблема, с которой я столкнулся, заключается в том, что я не могу создать внешний ключ для content_id, потому что в зависимости от content_type он может ссылаться на одну из двух таблиц. Есть ли способ настроить внешний ключ для просмотра правильной таблицы в зависимости от значения столбца content_type_id?


  • Пожалуйста, предоставьте свою таблицу DDL. 24.01.2014
  • Пахнет плохим дизайном. См., например, stackoverflow.com/questions/13311932/ 24.01.2014

Ответы:


1

Я не уверен, что понял ваш вопрос, но у вас проблема с дизайном. Если я правильно истолковал это, возможно, вам нужен такой дизайн:

введите здесь описание изображения

но я не могу этого знать, если вы не предоставите свой текущий дизайн.

На этом дизайне:

  • CONTENT_TYPE может быть POST или TOPIC.
  • MEDIA может иметь 1 CONTENT_TYPE (POST или TOPIC).
  • CONTENT_TYPE может быть связано с N MEDIA.
24.01.2014
  • Проблема, с которой я сталкиваюсь, заключается в том, что медиа — это то, что нужно прикрепить к содержимому (изображение, документ или файл другого типа). Таким образом, content_id также должен быть забытым ключом для таблицы, привязанным либо к идентификатору сообщения, либо к идентификатору темы. Так как таблица сообщений и таблица тем могут иметь перекрывающиеся идентификаторы, я надеялся использовать content_type_id как способ показать, что это либо сообщение, либо тема. Но я не знаю, есть ли способ, которым я могу проверить ограничение ключа forgien на его действительность на основе значения другого столбца. 24.01.2014
  • Чтобы различать сообщение или тему, вы можете добавить столбец в CONTENT_TYPE, чтобы сделать это. Вы можете использовать логическое значение или, лучше, целое число, чтобы в будущем иметь возможность увеличивать количество типов контента (1 для темы, 0 для сообщения). 24.01.2014

  • 2

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

    Например, перед созданием поста он создается с последовательным идентификатором в качестве первичного ключа (1,2,3,4...), а при создании темы то же самое происходит с последовательными ключами (1,2,3, 4,...).

    Когда медиа будет храниться в media_table, в media_table возникнет проблема с дублированием ключей объектов (как в сообщении с идентификатором 1, так и в теме с идентификатором 1 есть изображение). Первоначально это было разработано для решения с помощью дополнительного столбца в таблице мультимедиа, чтобы различать, является ли это сообщением или темой.

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

    24.01.2014
    Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..