Как использовать реляционную базу данных в качестве документа? - PullRequest
1 голос
/ 18 декабря 2009

Для создания системы управления документами я смотрю на хранилища документов, такие как MongoDB, но, поскольку у меня больше опыта работы с обычными базами данных (Firebird, Sql Server, Mysql), мне интересно, возможно ли моделировать хранилище документов поверх реляционного один.

Преимущества в хранилище документов, схема меньше:

  • Хорошо вписывается в задачу хранения произвольных метаданных о файлах
  • Нет необходимости обновлять схемы
  • По словам mongodb, отличная производительность для BLOB, как видео
  • Упрощенная масштабируемость

Но с реляционным:

  • Ссылочная целостность
  • Лучшая оснастка
  • Более устойчивы к сбоям и повреждениям
  • SQL

Итак, как может работать реляционная база данных в этом случае?

Ответы [ 2 ]

5 голосов
/ 18 декабря 2009

Рассмотрим шаблон Мартина Фаулера Сериализация LOB :

CREATE TABLE Documents (
  documentid SERIAL PRIMARY KEY,
  -- fixed relational attributes ...
  document TEXT -- contains XML, YAML, whatever
);

Вы можете поместить любые полуструктурированные данные с динамическими атрибутами в столбец document. Вы просто не можете легко использовать предикаты SQL для поиска или сортировки по полям в этом BLOB-объекте. Но в любом случае вы не могли этого сделать - атрибуты переменных являются нереляционными понятиями, и поддерживать их в SQL независимо от того, что именно, неудобно.

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

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

3 голосов
/ 19 декабря 2009

Простой пример MySQL:

CREATE TABLE Docs (
  id INT,
  attr VARCHAR(255),
  value BLOB,
  PRIMARY KEY (id, attr),
  KEY attr_index (attr)
)

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

SELECT * FROM Docs AS d1, docs AS d2 WHERE d1.attr = "foo" AND d2.attr = "bar"

Возвращает документы с атрибутами foo и bar.

...