Альтернативное решение для значений, разделенных запятыми, когда количество столбцов неизвестно | MySQL

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

Например,

  1. Есть «бесконечные» разновидности динозавров.
  2. Все Динозавры будут иметь некоторый общий набор признаков (имя, годы существования на Земле, вес, фамилия и т. д.).
  3. Будут некоторые специфические особенности, которые иногда не связаны с каждым сортом. Каждая такая функция идентифицируется парой «имя» = «значение». «Имя» — это что-то вроде названия функции (например, рога на голове, частота голоса и т. д.), а «значение» может быть значением функции (например, 3 рога на голове, частота голоса 10 Гц и т. д.). .,).

В соответствии с требованием мы можем создать таблицу X с общими функциями, такими как столбцы, относящиеся к cid, имени, годам существования, весу и т. д. И там может быть другая таблица Y только со столбцами (uid, имя, значение), где cid может быть привязан к uid.

Но тот факт, что количество строк в X будет огромным (триллион+, у нас может быть не так много семейств динозавров, но это просто пример). Точно так же name=value будет составлять несколько сотен на запись в таблице X. Это увеличит количество строк в таблице Y.

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

Одна из идей состоит в том, чтобы иметь еще два столбца в таблице X, где один столбец может состоять из всех функций («имя»), разделенных запятыми, а другой столбец может состоять из всех «значений», разделенных запятыми. Но я знаю, что это очень плохой дизайн.

Могут ли быть какие-либо лучшие решения для этого требования?


person user1093110    schedule 13.12.2011    source источник
comment
EAV: en.wikipedia.org/wiki/Entity-attribute-value_model весело...   -  person gbn    schedule 13.12.2011
comment
Когда вы говорите о динозавре, вы имеете в виду вид динозавра или образец динозавра (то есть отдельные окаменелости)? Все ли экземпляры одного и того же вида обладают одним и тем же набором свойств?   -  person Branko Dimitrijevic    schedule 14.12.2011


Ответы (1)


Взгляните на приведенный ниже пример. Вы указываете виды динозавров в dinosaur_type, отдельные динозавры идут в таблицу dinosaur и связаны с видом/типом, а затем в dinosaur_feature вы можете добавить строки для каждого отдельного динозавра, чтобы добавить любые (бесконечные) возможные функции для динозавра. .

Table `dinosaur`:
id 
dinosaur_type_id (fk)
name
years since existence on earth
weight
family name

Table `dinosaur_type`:
id
name

Table `dinosaur_feature`:
dinosaur_id (fk)
feature_name
feature_value
person Richard    schedule 13.12.2011
comment
Это намного лучше, чем огромный varchar, заполненный парами имя=значение. Я, вероятно, предложил бы также попытаться нормализовать ваше имя_функции, но если они действительно произвольны и бесконечны, это может оказаться невозможным. - person Cylindric; 13.12.2011
comment
Это структура EAV, которая имеет пары имя-значение в таблице dinosaur_feature. - person gbn; 13.12.2011