ZODB (Zope Object Database) — различия между версиями

Материал из Национальной библиотеки им. Н. Э. Баумана
Строка 29: Строка 29:
 
}}
 
}}
  
'''ZODB''' ({{lang-en|'''Z'''ope '''O'''bject '''D'''ata'''b'''ase}}) – [[OODB (Object-oriented Database)|объектно-ориентированная база данных]], предназначенная для хранения Python-объектов. Написана на [[Python|Python]] и является кроссплатформерной. Разработана Джимом Фултоном из Zope Corporation в конце 1990-х годов.<ref group>Mark Lutz. Programming Python, 3rd Edition. — O'Reilly Media, 2006. — 1600 с. — P. 1216–1226. — ISBN 978-0-596-00925-0</ref>
+
'''ZODB''' ({{lang-en|'''Z'''ope '''O'''bject '''D'''ata'''b'''ase}}) – [[OODB (Object-oriented Database)|объектно-ориентированная база данных]], предназначенная для хранения Python-объектов. Написана на [[Python|Python]] и является кроссплатформерной. Разработана Джимом Фултоном из Zope Corporation в конце 1990-х годов.<ref group = "Источник">Mark Lutz. Programming Python, 3rd Edition. — O'Reilly Media, 2006. — 1600 с. — P. 1216–1226. — ISBN 978-0-596-00925-0</ref>
  
 
==О базе данных==
 
==О базе данных==
В ZODB используется прозрачная система хранения Python-объектов. Будучи объектно-ориентированной, она позволяет строить произвольные модели данных для конкретного приложения. Одним из основных достоинств разработчики заявляют незаметность работы БД для пользователя - он просто выполняет обращения к объектам, ZODB делает всё остальное самостоятельно. ZODB полностью поддерживает модель [[ACID (Atomicity, Consistency, Isolation, Durability)|ACID]], что позволяет поддерживать целостность данных. Распространяется свободно по лицензии Zope Public License.<ref name = "Источник2">Официальный сайт  ZODB. // Zope Foundation. (2009 - 2016). Дата обновления: 25.10.2018. URL:  http://www.zodb.org/en/latest/  (дата обращения: 01.03.2019) </ref>
+
В ZODB используется прозрачная система хранения Python-объектов. Будучи объектно-ориентированной, она позволяет строить произвольные модели данных для конкретного приложения. Одним из основных достоинств разработчики заявляют незаметность работы БД для пользователя - он просто выполняет обращения к объектам, ZODB делает всё остальное самостоятельно. ZODB полностью поддерживает модель [[ACID (Atomicity, Consistency, Isolation, Durability)|ACID]], что позволяет поддерживать целостность данных. Распространяется свободно по лицензии Zope Public License.<ref name = "Источник2" group = "Источник">Официальный сайт  ZODB. // Zope Foundation. (2009 - 2016). Дата обновления: 25.10.2018. URL:  http://www.zodb.org/en/latest/  (дата обращения: 01.03.2019) </ref>
  
 
==Принцип работы==
 
==Принцип работы==
Строка 40: Строка 40:
  
 
==Применение ZODB==
 
==Применение ZODB==
ZOBD следует использовать в следующих случаях<ref name = "Источник2" />:
+
ZOBD следует использовать в следующих случаях<ref name = "Источник2" group = "Источник"/>:
 
===Небольшие приложения===
 
===Небольшие приложения===
 
ZODB проста в использовании, не требует знания отдельных [[Язык программирования|языков программирования]] и значительных изменений в коде приложения. Используйте её, если разработка приложения является более важной задачей, чем продумывание взаимодействия с БД. Можно также использовать ZODB на первых порах, до перехода на более сложную СУБД.
 
ZODB проста в использовании, не требует знания отдельных [[Язык программирования|языков программирования]] и значительных изменений в коде приложения. Используйте её, если разработка приложения является более важной задачей, чем продумывание взаимодействия с БД. Можно также использовать ZODB на первых порах, до перехода на более сложную СУБД.
Строка 55: Строка 55:
 
ZODB поддерживает множество различных способов хранения информации, в том числе - хранение в памяти, использование которого значительно упрощает тестирование.
 
ZODB поддерживает множество различных способов хранения информации, в том числе - хранение в памяти, использование которого значительно упрощает тестирование.
  
==Установка и создание баз данных<ref name = "Источник3"> ZODB programming guide. // Zope Foundation. (2009 - 2016). Дата обновления: 25.10.2018. URL:  http://www.zodb.org/en/latest/guide/index.html  (дата обращения: 01.03.2019) </ref><ref group"> API Reference. // Zope Foundation. [2010 - ]. Дата обновления: 28.09.2017. URL:  http://zodb.readthedocs.io/en/latest/api.html  (дата обращения: 01.03.2019) </ref>==
+
==Установка и создание баз данных==
  
 
===Установка===
 
===Установка===
Строка 120: Строка 120:
 
transaction.abort()
 
transaction.abort()
 
</syntaxhighlight>
 
</syntaxhighlight>
Транзакции являются очень мощным способом защиты целостности базы данных. При ава­рий­ном за­вер­ше­нии про­грам­мы из­ме­не­ния не бу­дут со­хра­не­ны в ба­зе дан­ных, ес­ли они не бы­ли яв­но под­твер­жде­ны.
+
Транзакции являются очень мощным способом защиты целостности базы данных. При ава­рий­ном за­вер­ше­нии про­грам­мы из­ме­не­ния не бу­дут со­хра­не­ны в ба­зе дан­ных, ес­ли они не бы­ли яв­но под­твер­жде­ны.<ref name = "Источник3" group = "Источник"> ZODB programming guide. // Zope Foundation. (2009 - 2016). Дата обновления: 25.10.2018. URL:  http://www.zodb.org/en/latest/guide/index.html  (дата обращения: 01.03.2019) </ref><ref group="Источник"> API Reference. // Zope Foundation. [2010 - ]. Дата обновления: 28.09.2017. URL:  http://zodb.readthedocs.io/en/latest/api.html  (дата обращения: 01.03.2019) </ref>
  
 
==Достоинства==
 
==Достоинства==
ZODB имеет следующие преимущества<ref group> The ZODB Book. Introduction // Zope Foundation. [2010 - ]. Дата обновления: 28.09.2017. URL:  http://zodb.readthedocs.io/en/latest/  (дата обращения: 01.03.2019) </ref>:
+
ZODB имеет следующие преимущества<ref group = "Источник"> The ZODB Book. Introduction // Zope Foundation. [2010 - ]. Дата обновления: 28.09.2017. URL:  http://zodb.readthedocs.io/en/latest/  (дата обращения: 01.03.2019) </ref>:
 
*Прозрачная структура. Работа с данными идёт через прямое обращение к объектам.
 
*Прозрачная структура. Работа с данными идёт через прямое обращение к объектам.
 
*Масштабируемая архитектура.
 
*Масштабируемая архитектура.

Версия 23:57, 14 июня 2019

ZODB (Zope Object Database)
ZODB logo.png
Разработчики: Zope Foundation
Постоянный выпуск: 5.5.1 / 25 октября 2018
Написана на: Python
Операционная система: Кросс-платформенное программное обеспечение
Локализация: Английский
Тип ПО: Объектно-ориентированная база данных
Лицензия: Zope Public License
Веб-сайт zodb.org

ZODB (англ. Zope Object Database) – объектно-ориентированная база данных, предназначенная для хранения Python-объектов. Написана на Python и является кроссплатформерной. Разработана Джимом Фултоном из Zope Corporation в конце 1990-х годов.[Источник 1]

О базе данных

В ZODB используется прозрачная система хранения Python-объектов. Будучи объектно-ориентированной, она позволяет строить произвольные модели данных для конкретного приложения. Одним из основных достоинств разработчики заявляют незаметность работы БД для пользователя - он просто выполняет обращения к объектам, ZODB делает всё остальное самостоятельно. ZODB полностью поддерживает модель ACID, что позволяет поддерживать целостность данных. Распространяется свободно по лицензии Zope Public License.[Источник 2]

Принцип работы

Для связи с ZODB объект должен быть унаследован от класса Persistent. При запросе объекта из БД, он извлекается и кэшируется в памяти. В случае изменения кэшированного объекта моментальный перенос в БД не происходит, копия объекта в памяти помечается, как "dirty" (грязный). Таким образом, текущее состояние базы данных может несколько отличаться от результатов работы пользователя, что позволяет совершать быструю отмену последних действий. Модификация базы данных происходит по специальному запросу, при этом все "грязные" объекты перезаписываются. ZODB поддерживает механизм транзакций, при этом хранится информация обо всех транзакциях, что позволяет откатить их.

Работа с БД осуществляется со словарём, который является "корнем" базы. Добавление любого объекта в этот словарь означает его запись в БД (хотя запись происходит не моментально, а по запросу). Чтение из этого словаря возвращает кэшированную версию объекта.

Применение ZODB

ZOBD следует использовать в следующих случаях[Источник 2]:

Небольшие приложения

ZODB проста в использовании, не требует знания отдельных языков программирования и значительных изменений в коде приложения. Используйте её, если разработка приложения является более важной задачей, чем продумывание взаимодействия с БД. Можно также использовать ZODB на первых порах, до перехода на более сложную СУБД.

Использование сложных взаимосвязей и структур данных

ZODB является объектно-ориентированной БД, что позволяет создавать структуры и взаимосвязи любой сложности, используя язык Python. Это значительно проще, чем создавать реляционные БД, где сложная структура будет требовать множества дорогостоящих объединений (join). Также ZOBD удобнее, чем NoSQL-решения, где сложные взаимосвязи между документами оказываются очень дорогостоящими, а иногда и вообще невозможными.

Доступ к данным через атрибуты и методы

ZODB не использует каких-либо специальных языков запросов. Поиск по БД здесь происходит через индексы, основанные на B-деревьях, с использованием высокоуровневого API для поиска. Это решение является приемлемым, если в ваших задачах доступ через атрибуты и методы является более приоритетным, чем прямой поиск по базе данных.

Чтение происходит намного чаще записи

ZODB активно использует кэширование. Если рабочий набор помещается в памяти, база данных предоставляет очень высокую производительность, практически не выполняя запросов к серверу. Если же ваше приложение много записывает в базу, возможно, вам следует применять другое решение. Это может быть комбинация другой БД с ZODB.

Тестирование логики, задействующей БД

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

Установка и создание баз данных

Установка

Прежде чем использовать ZODB, установите с помощью pip:

$ pip install ZODB

Создание баз данных

Для ZODB нам нужны 3 разные части: хранилище, база данных и соединение:

1 import ZODB, ZODB.FileStorage
2 storage = ZODB.FileStorage.FileStorage('mydata.fs')
3 db = ZODB.DB(storage)
4 connection = db.open()
5 root = connection.root

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

Создав хранилище, мы можем использовать его для создания экземпляра базы данных, к которой мы затем подключимся путем вызова open(). Процесс с несколькими потоками часто имеет несколько соединений с одной и той же базой данных, причем разные потоки имеют разные соединения.

Есть несколько способов, которые можно использовать для некоторых из наиболее часто используемых хранилищ:

Передача имя файла DB конструктору, чтобы он создал FileStorage:

1 db = ZODB.DB('mydata.fs')

Передача None для создания базы данных в памяти:

1 memory_db = ZODB.DB(None)

Если собираетесь использовать только одно соединение, то вызываем connection функцию:

1 connection = ZODB.connection('mydata.fs')
2 memory_connection = ZODB.connection(None)

Хранение объектов

Чтобы сохранить объект в ZODB, необходимо присоединить его к любому другому объекту, который уже находится в базе данных. Корневой объект функционирует как точка привязки к загрузке. Он предназначен для использования в качестве пространства имен для объектов верхнего уровня в базе данных. Можно хранить объекты учетной записи непосредственно в корневом объекте:

1 import account
2 root.account1 = account.Account()

Но если вы собираетесь хранить много объектов, вам нужно использовать объект коллекции:

1 import account, BTrees.OOBTree
2 root.accounts = BTrees.OOBTree.BTree()
3 root.accounts['account-1'] = Account()

Еще одна распространенная практика - хранить постоянный объект в корне базы данных:

1 root.accounts = AccountManagementApplication()

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

Транзакции

Теперь у вас есть объекты в вашем корневом объекте и в вашей базе данных. Тем не менее, они еще не хранятся на постоянной основе. ZODB использует транзакции, и чтобы сделать ваши изменения постоянными, вы должны зафиксировать транзакцию:

1 import transaction
2 transaction.commit()

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

Прервать транзакцию и отменить изменения можно следующей командой:

1 transaction.abort()

Транзакции являются очень мощным способом защиты целостности базы данных. При ава­рий­ном за­вер­ше­нии про­грам­мы из­ме­не­ния не бу­дут со­хра­не­ны в ба­зе дан­ных, ес­ли они не бы­ли яв­но под­твер­жде­ны.[Источник 3][Источник 4]

Достоинства

ZODB имеет следующие преимущества[Источник 5]:

  • Прозрачная структура. Работа с данными идёт через прямое обращение к объектам.
  • Масштабируемая архитектура.
  • Поскольку база данных написана на Python и хранит Python-объекты, не требуется никаких дополнительных языков для взаимодействия с ней.
  • Использование объектов из БД требует лишь незначительных поправок в коде.
  • Использование базы данных практически не отличается от обычного обращения к объектам.
  • Простота тестирования. Предоставляемые ZODB реализации in-memory, а также copy-on-write хранилищ, значительно упрощают тестирование кода, относящегося к работе с БД.
  • Подключаемое многослойное хранилище. В ZODB имеется возможность использовать много разных архитектур хранения информации, подключаемых извне, вот некоторые из них:
    • Файловое хранилище для объектов на диске.
    • Каталогизированное хранилище. Объекты хранятся на диске, каждый в отдельном файле файловой системы.
    • Сетевое хранилище. Для хранения используется ZEO.
    • Хранилище RelStorage. Объекты сохраняются в реляционной СУБД.
    • Демо-хранилище. Используется для тестирования, доступно только для чтения.

Недостатки

  • Отсутствие встроенных механизмов сложных индексов. В ZODB нет таких мощных механизмов создания индексов, как в реляционных СУБД. Здесь используется перебор словаря для нахождения нужных значений. Это накладывает серьёзные ограничения на реализацию поиска по сложным критериям.
  • Отсутствие удобного доступа к данным из приложений реализованных не на Python. В случае реализации какого-либо сложного проекта на базе ZODB, придётся реализовывать API для доступа к данным, хранящимся в ней, для тех программ, которые выполнены не на Python.

Источники

  1. Mark Lutz. Programming Python, 3rd Edition. — O'Reilly Media, 2006. — 1600 с. — P. 1216–1226. — ISBN 978-0-596-00925-0
  2. 2,0 2,1 Официальный сайт ZODB. // Zope Foundation. (2009 - 2016). Дата обновления: 25.10.2018. URL: http://www.zodb.org/en/latest/ (дата обращения: 01.03.2019)
  3. ZODB programming guide. // Zope Foundation. (2009 - 2016). Дата обновления: 25.10.2018. URL: http://www.zodb.org/en/latest/guide/index.html (дата обращения: 01.03.2019)
  4. API Reference. // Zope Foundation. [2010 - ]. Дата обновления: 28.09.2017. URL: http://zodb.readthedocs.io/en/latest/api.html (дата обращения: 01.03.2019)
  5. The ZODB Book. Introduction // Zope Foundation. [2010 - ]. Дата обновления: 28.09.2017. URL: http://zodb.readthedocs.io/en/latest/ (дата обращения: 01.03.2019)