Является ли хорошей практикой иметь две таблицы SQL с биективным соответствием строк?

У меня есть таблица задач,

 id | name
----+-------------
 1  | brush teeth
 2  | do laundry

и таблица состояний.

 taskid | state
--------+-------------
 1      | completed
 2      | uncompleted

Между таблицами существует биективное соответствие, т.е. каждая строка в task таблица соответствует ровно одной строке в state Таблица.

Другим способом реализации этого было бы разместить state грести в task Таблица.

 id | name        | state
----+-------------+-------------
 1  | brush teeth | completed
 2  | do laundry  | uncompleted

Основная причина, по которой я решил использовать две таблицы вместо этой, заключается в том, что обновление state затем вызовет изменение в задаче id, У меня есть другие таблицы, ссылающиеся на task(id) столбец, и не нужно обновлять все эти другие таблицы также при изменении состояния задачи.

У меня есть два вопроса по этому поводу.

  1. Является ли хорошей практикой иметь две таблицы в биективном соответствии строки-строки?
  2. Есть ли способ, которым я могу обеспечить ограничение, что есть ровно одна строка в state таблица, соответствующая каждой строке в task Таблица?

Система, которую я использую postgresql,

1 ответ

Решение

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

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

Другая цель - хранить отдельные столбцы в разных местах. Когда я узнал о базах данных, этот подход назывался вертикальным разделением. В настоящее время столбчатые базы данных относительно распространены; они сводят понятие до крайности - отдельное "хранилище" для каждого столбца (хотя "хранилище" не совсем "таблица").

Зачем ты это делаешь? Вот несколько причин:

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

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

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

Другие вопросы по тегам