Что делать, если есть поле, значения которого должны иметь разные типы? - PullRequest
0 голосов
/ 06 июня 2018

Допустим, у меня есть приложение, в котором пользователи могут «создавать» животных.У животного могут быть различные атрибуты: его цвет, вес, являются ли они дикими и т. Д. Когда я определяю в БД, какие значения может иметь атрибут, у меня возникает проблема:

Table: attributes
+-------------+
| id | name   |
+-------------+
|  1 | color  |
|  2 | weight |
|  3 | wild   |
+-------------+

Table: values
+--------------------------------+
| att_id (fkey) | name (varchar) |
+--------------------------------+
|             1 | brown          | ok
|             1 | grey           | ok
|             1 | white          | ok
|             2 | 300            | <-- not good to put this in a varchar field
|             3 | yes            | <-- not good to put this in a varchar field
+--------------------------------+

Как решить эту проблему?Должен ли я создать еще две таблицы для значений int и boolean и установить для каждого атрибута в таблице attributes, в которой таблица values, значения для данного атрибута должны быть найдены?Или какой будет правильный дизайн?

1 Ответ

0 голосов
/ 06 июня 2018

Вот три подхода Postgres:

  • Имеет столбец type и отдельный столбец для каждого типа (value_date, value_string,...).
  • Используйте JSON / XML для хранения значения (хотя это может ограничивать типы).
  • Сохранять фактические значения в отдельных столбцах.

Часто эта проблема возникает из-за того, что вы хотитеесть столбец с "отличной" информацией.Например, сейчас я работаю над проектом данных, объединяющим данные из разных источников.Я хочу представить информацию об уровне источника в каждой строке, но это зависит от источника.Мое решение?Я представляю данные как обычную строку со столбцом source_system_info.Этот столбец содержит JSON-представление того, что я хочу включить из исходной системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...