Является ли хорошей практикой иметь две таблицы 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)
столбец, и не нужно обновлять все эти другие таблицы также при изменении состояния задачи.
У меня есть два вопроса по этому поводу.
- Является ли хорошей практикой иметь две таблицы в биективном соответствии строки-строки?
- Есть ли способ, которым я могу обеспечить ограничение, что есть ровно одна строка в
state
таблица, соответствующая каждой строке вtask
Таблица?
Система, которую я использую postgresql
,
1 ответ
Вы можете обеспечить соответствие 1-1, сделав идентификатор в каждой таблице первичным ключом и внешним ключом, который ссылается на идентификатор в другой таблице. Это разрешено, и это гарантирует 1-1.
Иногда вам нужны такие таблицы, но в одной таблице меньше строк, чем в другой. Это происходит, когда есть отношение поднабора, и вам не нужны дополнительные столбцы во всех строках.
Другая цель - хранить отдельные столбцы в разных местах. Когда я узнал о базах данных, этот подход назывался вертикальным разделением. В настоящее время столбчатые базы данных относительно распространены; они сводят понятие до крайности - отдельное "хранилище" для каждого столбца (хотя "хранилище" не совсем "таблица").
Зачем ты это делаешь? Вот несколько причин:
- Вы редко использовали столбцы, которые не хотите загружать для каждого запроса в более частых столбцах.
- Вы часто обновляете столбцы и не хотите блокировать остальные столбцы.
- У вас слишком много столбцов для хранения в одной строке.
- У вас разные требования к безопасности для разных столбцов.
Postgres предлагает другие механизмы, которые могут оказаться уместными. В частности, наследование таблиц может быть полезным в вашей ситуации.
Все это говорит о том, что вы обычно не создавали бы такую базу данных. Для этого есть веские причины, но более типичным является размещение всех столбцов, связанных с сущностью, в одной таблице.