[ZODB-Dev] ZODB design. Size and saving records

tsmiller tsmiller at gnixterhouse.com
Sun Jun 22 11:54:14 EDT 2008


ZODB guys,

I have a bookstore application in which I use the ZODB in a simple way.  The
database saves stores and records in the stores.
I open the database as follows where the databasePath argument points to my
bookserver.fs file.

from ZODB import FileStorage, DB
import  transaction
import BTrees.OOBTree,  BTrees.IOBTree

       def open(self, databasePath):
                self.bookDatabase_storage     =
FileStorage.FileStorage(databasePath)
                self.bookDatabase_db          =
DB(self.bookDatabase_storage)
                self.bookDatabase_connection  = self.bookDatabase_db.open()
                self.dbRoot = self.bookDatabase_connection.root()

       # our btrees
        ibTree = BTrees.IOBTree

I define the key 'books' to be an IOBTree

        db.dbRoot['books'] = ibTree.IOBTree()

And when the user creates a store I define the book number to be an IOBTree

        db.dbRoot['books'][storeNumber] = ibTree.IOBTree()

Then I save the book using storeNumber and bookNumber as keys.

	record = {'title':"The Grapes of Wrath", 'author':"John
Steinbeck",'publisher':"Randomhouse"}
        db.dbRoot['books'][storeNumber][bookNumber] = record

So now I can qualify an entire store by using

				currentStore = db.dbRoot['books'][storeNumber]

And a single book by

				currentBook= db.dbRoot['books'][storeNumber][bookNumber]

And look at the books in the store by
			  for k, v in currentStore.values():
						print k, v

I have two questions.
		1)  When I already have a storeNumber and I save a record to 

             			db.dbRoot['books'][storeNumber][bookNumber] = record

		 I have to set the _p_changed flag on the 'books' IOBTREE structure to get
the book to save.

				db.dbRoot['books']._p_changed = True

		Which means that it saves the ENTIRE 'books' IOBTREE' structure every time
a save a single book.  (at least it looks like it is doing this).  When I
edit a book and save it the database grows by more than 64k.  And it looks
like it will get worse and worse as more books are added.

		Am I looking at this correctly.  Or am I doing something really ignorant?

		2)  When I assign a value to the db such as 

             		db.dbRoot['books'][storeNumber][bookNumber] = record

			I initially assumed that setting the _p_changed flag on the storeNumber
key would only save the single record that I want to save.   As mentioned
above, I am setting the flag on the 'books' IOBTREE also.  Should I have to
set it on both.  I have come to the conclusion that the _p_changed flag must
be set at the highest key level.  ie.. 'books'.  Again, Am I doing something
really ignorant?  


Thank you for your responses.  I really need to know and get this fixed
before my wife divorces me!  She spends time entering books and we still
seem to not really know when the changes are going to permanently be saved.  

Tom




-- 
View this message in context: http://www.nabble.com/ZODB-design.-Size-and-saving-records-tp18055895p18055895.html
Sent from the Zope - ZODB-Dev mailing list archive at Nabble.com.



More information about the ZODB-Dev mailing list