, Почему эти два подхода определяются как являющийся исключительно?
я не вижу жизнеспособного аргумента в пользу не использование, существующее ранее наборы данных, особенно конкретные данные, которые вызвали проблемы в прошлом.
я не вижу жизнеспособного аргумента в пользу не программно расширение, что данные со всеми возможными условиями, что можно предположить вызывать проблемы и даже немного случайных данных для интеграционного тестирования .
В современном гибкие подходы , Модульные тесты - то, где действительно имеет значение, что те же тесты запущены каждый раз. Это вызвано тем, что модульные тесты нацелены не на нахождение ошибок, а на сохранение функциональности приложения, поскольку это разрабатывается, позволяя разработчику осуществить рефакторинг по мере необходимости.
Интеграционные тесты, с другой стороны, разработаны для нахождения ошибок, которые Вы не ожидали. При выполнении с приблизительно различные данные каждый раз может даже быть хорошим, по-моему. Просто необходимо удостовериться, что тест сохраняет провальные данные, если Вы получаете отказ. Помните в формальном интеграционном тестировании, само приложение будет заморожено за исключением исправлений ошибок, таким образом, Ваши тесты смогут быть изменением для тестирования на максимальное возможное число и виды ошибок. В интеграции Вы можете и должны бросить раковину в приложение.
, Поскольку другие отметили, конечно, все это естественно зависит от вида приложения, которое Вы разрабатываете и вид организации, Вы находитесь в, и т.д.
Если вы когда-либо планируете поиск определенных атрибутов, сериализовать их в один столбец - плохая идея, так как вам придется использовать построчные функции для получить информацию - это редко хорошо масштабируется.
Я бы выбрал второй вариант. Имейте список атрибутов в таблице атрибутов, объекты в их собственной таблице и таблицу отношений «многие ко многим», называемую атрибутами объекта.
Например:
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 по соображениям производительности.
В этом случае я бы сохранил его таким же образом, но также имел бы столбец с необработанными сериализованными данными. При условии, что вы используете триггеры вставки / обновления для синхронизации столбчатых и комбинированных данных, у вас не будет никаких проблем. Но вы не должны беспокоиться об этом до тех пор, пока не появится реальная проблема.
Используя эти триггеры, вы минимизируете работу, необходимую для только при изменении данных. Пытаясь извлечь информацию из подстолбца, вы выполняете ненужную работу с при каждом выборе .
Вариантом вашего 2-мерного решения являются всего две таблицы (при условии, что все атрибуты одного типа):
T1: | Столбцы данных объекта | Object_id |
T2: | Объект id | имя_атрибута | значение атрибута | (уникальный индекс в первых 2 столбцах)
Это еще более эффективно в сочетании с третьим решением, например, все общие поля переходят в T1.
Вставка> 1 атрибута в один и тот же blob не рекомендуется - вы не можете фильтровать по атрибутам, вы не можете эффективно их обновлять
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') }.
Я использовал для реализации эту схему :
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
содержать то, что вы обычно не ищите (например, текстовые описания и т. д.).
Быстрые свойства на самом деле обычные таблицы, которые есть в базе данных, чтобы запросы были эффективными. Они содержат значения только для экземпляров определенного класса или его потомков. Это сделано для того, чтобы избежать лишних объединений.
Вам не нужно использовать быстрые таблицы и ограничивать все свои данные этими четырьмя таблицами.
Если вы используете реляционную базу данных, я думаю, вы хорошо поработали, перечислив варианты. У каждого из них есть свои плюсы и минусы. ВЫ находитесь в лучшем положении, чтобы решить, что лучше всего подходит для ваших обстоятельств.
Сериализованный подход, вероятно, самый быстрый (в зависимости от вашего кода для десериализации), но это означает, что вы не сможете запрашивать данные с SQL. Если вы говорите, что вам не нужно запрашивать данные с помощью SQL, то я согласен с @longneck, возможно, вам следует использовать db стиля ключ / значение вместо реляционного db.
EDIT - прочтите больше ваших комментариев, ПОЧЕМУ вы переходите на db, если скорость является вашей главной заботой. Что ПЛОХОГО в вашей текущей реализации XML?
звучит так, как будто вам нужно что-то лизнуть couchdb , а не СУБД.
, если вы собираетесь редактировать / манипулировать / удалять атрибуты в более позднем пункте, я выберу истинное n: m (второй вариант). (Или попробуйте сделать 2 таблицы, в которых повторяется один и тот же атрибут.