Re: [ZODB-Dev] New to ZODB, how to make a db efficently?

2008-08-25 Thread Jean Jordaan
Hi Markus

I'll try with some easy answers that won't help you much ;-)

> What makes a physical structure physical? (If I point to the same persistent
> objects from different BTrees, which one then is physical if I store them?)

The first one stored.

> Should I always use an appropriate BTree to store a big mapping? (Becuse the
> BTree isn't loaded at once)

Yes, particularly for a big flat mapping (e.g. a folder containing
many many items).

> How do indexes basically work or how they are made? (Are they also BTrees,
> so that if they are big, they won't load at once?)

Yes they are BTrees.

-- 
jean. ..  //\\\oo///\\
___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev


[ZODB-Dev] New to ZODB, how to make a db efficently?

2008-08-25 Thread Markus
Thank you very much for the answer!Although I've read and
searched around, may I ask some more questions:What makes a
physical structure physical? (If I point to the same persistent objects
from different BTrees, which one then is physical if I store
them?)Should I always use an appropriate BTree to store a big
mapping? (Becuse the BTree isn't loaded at once)
How do
indexes basically work or how they are made? (Are they also BTrees, so
that if they are big, they won't load at once?)When should I
ever use a XXBucket, XXSet or XXTreeSet? (Or are they just internally
used classes in a XXBTree? Or if they aren't, do they have any
advantages, when using in ZODB?)By a VFS-like structure you
mean a non-flat structure? (Like a deeper mapping, like: Family name
-> id -> person?)Markus
___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev


Re: [ZODB-Dev] New to ZODB, how to make a db efficently?

2008-08-19 Thread Christian Theune
Hi,

On Mon, 2008-08-18 at 20:17 +0300, Markus wrote:
> I'm new here, so hi! ;-)
> 
> I'm looking to create a database of persons and events, later to
> search persons by names, events by dates and locations (participants
> of events are already in an attribute of the event and instances of
> Person, which inherits from Persistent)
> 
> At first I made a PersistentList of all the events and a
> PersistentMapping of all the people by an id, but later found out,
> that searching through a list with a for-loop is very slow (there are
> about 200 000 people and 100 000 events). And so as I've looked around
> here a bit (the docs and
> the wikis are mostly outdated or empty -- there's also talk about the
> bad documentation in this mailinglist) I've found, that I should be
> using OOBTree for making the indexes.

Yes, the documentation situation is less than desirable for
beginners. :/

> So what I'm asking is, is it reasonable to create the db like this:
> persons in root['persons'],
> which is a OOBTree, mapping names to Person-objects and events in
> root['events'], which also an OOBTree, mapping dates to Event-objects?
> And if I want to map locations to events, I should do it at the same
> time, when creating the events, so I don't have to loop through all of
> them again?

Here's what I do:

Create a physical structure that models your data in a 'natural' way.
This can e.g. be:

- A root object representing the application, in case you may want to
  hold multiple instances of your application within a single database.

- BTrees for storing large lists of objects, like you do. But mainly
  with a single lookup direction, e.g. for you the name-to-person
  mapping.

  Some times, those lists just work with arbitrary IDs for the objects,
  much like primary keys in tables.

  Alternatively, if you have a VFS-like structure, you might want to use
  the folder/item metaphor for the main structure of your database.

- Add an indexing/searching framework for orthogonal queries. This is
  called `cataloging` in the Zope/ZODB universe. Some (more or less)
  standalone solutions are found in the proximity of `zope.catalog`.

  Use those to create tabular views on your data (independent of the
  physical structure) that are queryable by indexed arguments. Those are
  fast.

> If I have a OOBTree-mapping of dates to events, what should the values
> of it be? PersistentLists? I've read something about Buckets or Sets,
> but I'm not sure what they are good
> for, Bucket seems to behave like the equivalent BTree (OO, or IO or OI
> or IF or ), but Set seems to be a set... Is that true?

I'd go with a flat structure. See my note on 'arbitrary' IDs above.

> What's the difference between a PersistentMapping and a OOBTree or
> OOBucket? Only the "back-end", because on the front they all seem like
> dictionarys? Should I be using OOBTrees and OOBuckets for what I'm
> doing, because strings and dates are "O"s and not "I"s or "F"s or...

A PM is a persistent dictionary that loads all of its data at once.

A bucket is an internal node of a BTree.

A BTree is a (key-)sorted(!) data structure that provides a key/value
interface like dictionaries do. Due to that, the lookup of items in a
BTree is fast and also memory efficient, as only individual buckets of
the BTree need to be activated for a lookup (optimally only O(logn)
buckets).

Christian

-- 
Christian Theune · [EMAIL PROTECTED]
gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 7 · fax +49 345 1229889 1
Zope and Plone consulting and development


signature.asc
Description: This is a digitally signed message part
___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev


[ZODB-Dev] New to ZODB, how to make a db efficently?

2008-08-18 Thread Markus
I'm new here, so hi! ;-)

I'm looking to create a database
of persons and events, later to search persons by names, events by
dates and locations (participants of events are already in an
attribute of the event and instances of Person, which inherits from
Persistent)

At first I made a PersistentList of all the events
and a PersistentMapping of all the people by an id, but later found
out, that searching through a list with a for-loop is very slow
(there are about 200 000 people and 100 000 events). And so as I've
looked around here a bit (the docs and
the wikis are mostly outdated
or empty -- there's also talk about the bad documentation in this
mailinglist) I've found, that I should be using OOBTree for making
the indexes.

So what I'm asking is, is it reasonable to create
the db like this: persons in root['persons'],
which is a OOBTree,
mapping names to Person-objects and events in root['events'],
which also an OOBTree, mapping dates to Event-objects? And if I
want to map locations to events, I should do it at the same time,
when creating the events, so I don't have to loop through all of them
again?

If I have a OOBTree-mapping of dates to events, what
should the values of it be? PersistentLists? I've read something
about Buckets or Sets, but I'm not sure what they are good
for,
Bucket seems to behave like the equivalent BTree (OO, or IO or OI or
IF or ), but Set seems to be a set... Is that
true?

What's the difference between a PersistentMapping and a
OOBTree or OOBucket? Only the "back-end", because on the front they
all seem like dictionarys? Should I be using OOBTrees and OOBuckets
for what I'm doing, because strings and dates are "O"s and not "I"s
or "F"s or...

Thank you very much for any hints, tips, links
or help! ;-)

Markus___
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev