В SQLite (или Postgres), вы можете иметь таблицу с переменным количеством элементов строки? - PullRequest
1 голос
/ 08 марта 2011

Я создаю таблицу действий со многими типами действий.Скажем, действия типа "бег трусцой" будут иметь элементы a, b и c, в то время как действия "футбол" будут иметь элементы a, d и e.Могу ли я создать таблицу, в которой элементы строки для каждого столбца зависят от типа этого столбца?Я рассмотрел возможность создания одной таблицы для каждого типа действия или создания одной таблицы со строками для параметров каждого действия, но будет много типов действий, поэтому использование большого количества таблиц или пустое количество строк выглядит пустым.

Ответы [ 4 ]

3 голосов
/ 08 марта 2011

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

Для злого быстрого взлома вы можете сохранить переменное количество аргументов в одном столбце в определенном формате и снова проанализировать его. Что-то вроде «a: foo | e: bar | f: qux». Не делайте этого, он выйдет из-под контроля примерно через 1 день.

Я второе предложение Джеймса: переделать ваши столы. Затем он должен выглядеть примерно так.

Table: Activities
id|activity
0|jogging
1|football
2|...

Table: ElementsOfActivities
id|activity_id|element
0|0|a
1|0|b
2|0|c
3|1|a
4|1|d
5|1|e

Посмотрите "нормализация" (например, http://en.wikipedia.org/wiki/Database_normalization)

1 голос
/ 08 марта 2011

Я предполагаю, что в теме вы имеете в виду столбец вместо строка , поскольку вся концепция таблицы основана на том факте, что имеет переменное число строк. То же самое относится и к вашему утверждению «оставьте так много строк пустым» - опять же я предполагаю, что вы говорите о столбцах .

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

В Postgres все несколько проще. Он имеет модуль contrib под названием "hstore", который по сути то, что вы ищете. Msgstr "Несколько столбцов внутри одного столбца".

Самый большой недостаток модуля hstore - потеря безопасности типов. Вы можете поместить только символьные данные в столбец hstore. Поэтому нельзя сказать, что «атрибут * цена» является числовым, атрибут имя является символьным значением ».

Если вы можете жить с этим ограничением, hstore, вероятно, то, что вы ищете в Postgres

0 голосов
/ 08 марта 2011

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

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

Например, выможет иметь:

jogging(activity_id int, a type, b type, c type)
football(activity_id int, a type, d type, e type)

и затем создать представление для объединения их вместе при желании:

create view activity as
select 'jogging', activity_id, a, b, c, null as d, null as e from jogging
union all
select 'football', activity_id, a, null, null, d, e from football

В качестве альтернативы вы можете иметь:

activity(activity_id int, a type)
jogging(activity_id int, b type, c type)
football(activity_id int, d type, e type)

и затем:

create view activity as
select case when jogging.activity_id is not null then 'jogging'
            when football.activity_id is not null then 'football'
       end,
       activity_id, a, b, c, d, e
from activity
     left join jogging using (activity_id)
     left join football using (activity_id)

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

0 голосов
/ 08 марта 2011

Это сложно.Короткий ответ - нет."Вы должны спросить себя, о чем вы пытаетесь сообщить, и попытаться найти другую схему для отслеживания ваших данных.

Если вы действительно хотите реализовать таблицу с переменным числом столбцов, вы можете сделать что-то близкое.

Определите типы действий, а также элементы, которые вы будете отслеживать в каждом из них, и таблицу соединений для разрешения отношения «многие ко многим».Эти таблицы будут в основном статичными.Тогда у вас есть таблица Activity и таблица ActivityAttribute.

Создайте таблицу действий, а затем создайте таблицы типов действий, элементов действий, элементов типов действий и атрибутов действий.

Типами будут "бег трусцой", "футбол".

Элементами будут "a", "b", "c", "d" ...

Элементы типа будут иметь строки, которые выглядят как «jogging: a», «jogging: b», «jogging: c», «football: a», «football: d»

Атрибуты будут иметь фактические данные: «18236: а:« 0: 10: 24 »,« 18237: д: «356 ярдов» »

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