Как хранить данные с динамическим количеством атрибутов в базе данных

, Почему эти два подхода определяются как являющийся исключительно?

  • я не вижу жизнеспособного аргумента в пользу не использование, существующее ранее наборы данных, особенно конкретные данные, которые вызвали проблемы в прошлом.

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

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

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

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

19
задан Jörg 18 September 2009 в 13:09
поделиться

7 ответов

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

Я бы выбрал второй вариант. Имейте список атрибутов в таблице атрибутов, объекты в их собственной таблице и таблицу отношений «многие ко многим», называемую атрибутами объекта.

Например:

objects:
    object_id    integer
    object_name  varchar(20)
    primary key  (object_id)
attributes:
    attr_id      integer
    attr_name    varchar(20)
    primary key  (attr_id)
object_attributes:
    object_id    integer  references (objects.object_id)
    attr_id      integer  references (attributes.attr_id)
    oa_value     varchar(20)
    primary key (object_id,attr_id)

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

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

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

24
ответ дан 30 November 2019 в 03:25
поделиться

Вариантом вашего 2-мерного решения являются всего две таблицы (при условии, что все атрибуты одного типа):

T1: | Столбцы данных объекта | Object_id |

T2: | Объект id | имя_атрибута | значение атрибута | (уникальный индекс в первых 2 столбцах)

Это еще более эффективно в сочетании с третьим решением, например, все общие поля переходят в T1.

Вставка> 1 атрибута в один и тот же blob не рекомендуется - вы не можете фильтровать по атрибутам, вы не можете эффективно их обновлять

6
ответ дан 30 November 2019 в 03:25
поделиться

Let me give some concreteness to what DVK was saying.

Assuming values are of same type the table would look like (good luck, I feel you're going to need it):

dynamic_attribute_table
------------------------
id         NUMBER
key        VARCHAR
value      SOMETYPE?

example (cars):

|id|    key   |   value   |
---------------------------
| 1|'Make'    |'Ford'     |
| 1|'Model'   |'Edge'     |
| 1|'Color'   |'Blue'     |
| 2|'Make'    |'Chevrolet'|
| 2|'Model'   |'Malibu'   |
| 2|'MaxSpeed'|'110mph'   |

Thus,
entity 1 = { ('Make', 'Ford'), ('Model', 'Edge'), ('Color', 'Blue') }
and,
entity 2 = { ('Make', 'Chevrolet'), ('Model', 'Malibu'), ('MaxSpeed', '110mph') }.

3
ответ дан 30 November 2019 в 03:25
поделиться

Я использовал для реализации эту схему :

t_class (id RAW(16), parent RAW(16)) -- holds class hierachy.
t_property (class RAW(16), property VARCHAR) -- holds class members.
t_declaration (id RAW(16), class RAW(16)) -- hold GUIDs and types of all class instances
t_instance (id RAW(16), class RAW(16), property VARCHAR2(100), textvalue VARCHAR2(200), intvalue INT, doublevalue DOUBLE, datevalue DATE) -- holds 'common' properties

t_class1 (id RAW(16), amount DOUBLE, source RAW(16), destination RAW(16)) -- holds 'fast' properties for class1.
t_class2 (id RAW(16), comment VARCHAR2(200)) -- holds 'fast' properties for class2
--- etc.

RAW (16) - это место, где Oracle содержит GUID s

Если вы хотите выбрать все свойства для объекта, вы вводите:

SELECT  i.*
FROM    (
        SELECT  id 
        FROM    t_class
        START WITH
                id = (SELECT class FROM t_declaration WHERE id = :object_id)
        CONNECT BY
                parent = PRIOR id
        ) c
JOIN    property p
ON      p.class = c.id
LEFT JOIN
        t_instance i
ON      i.id = :object_id
        AND i.class = p.class
        AND i.property = p.property

t_property содержать то, что вы обычно не ищите (например, текстовые описания и т. д.).

Быстрые свойства на самом деле обычные таблицы, которые есть в базе данных, чтобы запросы были эффективными. Они содержат значения только для экземпляров определенного класса или его потомков. Это сделано для того, чтобы избежать лишних объединений.

Вам не нужно использовать быстрые таблицы и ограничивать все свои данные этими четырьмя таблицами.

2
ответ дан 30 November 2019 в 03:25
поделиться

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

Сериализованный подход, вероятно, самый быстрый (в зависимости от вашего кода для десериализации), но это означает, что вы не сможете запрашивать данные с SQL. Если вы говорите, что вам не нужно запрашивать данные с помощью SQL, то я согласен с @longneck, возможно, вам следует использовать db стиля ключ / значение вместо реляционного db.

EDIT - прочтите больше ваших комментариев, ПОЧЕМУ вы переходите на db, если скорость является вашей главной заботой. Что ПЛОХОГО в вашей текущей реализации XML?

2
ответ дан 30 November 2019 в 03:25
поделиться

звучит так, как будто вам нужно что-то лизнуть couchdb , а не СУБД.

1
ответ дан 30 November 2019 в 03:25
поделиться

, если вы собираетесь редактировать / манипулировать / удалять атрибуты в более позднем пункте, я выберу истинное n: m (второй вариант). (Или попробуйте сделать 2 таблицы, в которых повторяется один и тот же атрибут.

1
ответ дан 30 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: