DODB: basic usage and basic indexes.
parent
9a687a35cb
commit
8525fbf5db
140
graphs/graphs.ms
140
graphs/graphs.ms
|
@ -14,6 +14,13 @@
|
||||||
.QE
|
.QE
|
||||||
..
|
..
|
||||||
.
|
.
|
||||||
|
.de COMMAND
|
||||||
|
.I \\$*
|
||||||
|
..
|
||||||
|
.de DIRECTORY
|
||||||
|
.I \\$*
|
||||||
|
..
|
||||||
|
.
|
||||||
. \" The document starts here.
|
. \" The document starts here.
|
||||||
.
|
.
|
||||||
.TITLE Document Oriented DataBase (DODB)
|
.TITLE Document Oriented DataBase (DODB)
|
||||||
|
@ -154,6 +161,8 @@ DODB is a hash table.
|
||||||
The key of the hash is an auto-incremented number and the value is the stored data.
|
The key of the hash is an auto-incremented number and the value is the stored data.
|
||||||
The following section will explain how to use DODB for basic cases including the few added mechanisms to speed-up searches.
|
The following section will explain how to use DODB for basic cases including the few added mechanisms to speed-up searches.
|
||||||
Also, the file-system representation of the data will be presented since it enables easy off-application searches.
|
Also, the file-system representation of the data will be presented since it enables easy off-application searches.
|
||||||
|
.
|
||||||
|
.
|
||||||
.SS Before starting: the example database
|
.SS Before starting: the example database
|
||||||
First things first, the following code is the structure used in the rest of the document to present the different aspects of DODB.
|
First things first, the following code is the structure used in the rest of the document to present the different aspects of DODB.
|
||||||
This is a simple object
|
This is a simple object
|
||||||
|
@ -166,6 +175,8 @@ class Car
|
||||||
property keywords : Array(String)
|
property keywords : Array(String)
|
||||||
end
|
end
|
||||||
.SOURCE
|
.SOURCE
|
||||||
|
.
|
||||||
|
.
|
||||||
.SS DODB basic usage
|
.SS DODB basic usage
|
||||||
Let's create a DODB database for our cars.
|
Let's create a DODB database for our cars.
|
||||||
.SOURCE Ruby ps=10
|
.SOURCE Ruby ps=10
|
||||||
|
@ -210,36 +221,138 @@ The file "0000000000" contains the following:
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
.SOURCE
|
.SOURCE
|
||||||
|
The car is serialized as expected in the file
|
||||||
|
.I 0000000000 .
|
||||||
.QE
|
.QE
|
||||||
|
.de FUNCTION_CALL
|
||||||
|
.I \\$*
|
||||||
|
..
|
||||||
|
.
|
||||||
|
.
|
||||||
|
Next step, to retrieve, to modify or to delete a value, its key will be required.
|
||||||
|
.
|
||||||
|
.QP
|
||||||
|
.SOURCE Ruby ps=10
|
||||||
|
# Get a value based on its key.
|
||||||
|
db[key]
|
||||||
|
|
||||||
|
# Update a value based on its key.
|
||||||
|
db[key] = new_value
|
||||||
|
|
||||||
|
# Delete a value based on its key.
|
||||||
|
db.delete 0
|
||||||
|
.SOURCE
|
||||||
|
.QE
|
||||||
|
.
|
||||||
|
The function
|
||||||
|
.FUNCTION_CALL each_with_index
|
||||||
|
lists the entries with their keys.
|
||||||
|
.
|
||||||
|
.QP
|
||||||
|
.SOURCE Ruby ps=10
|
||||||
|
db.each_with_index do |value, key|
|
||||||
|
puts "#{key}: #{value}"
|
||||||
|
end
|
||||||
|
.SOURCE
|
||||||
|
.QE
|
||||||
|
Of course, browsing the entire database to find a value (or its key) is a waste of resources and isn't practical for any non-trivial database.
|
||||||
|
That is when indexes come into play.
|
||||||
|
.
|
||||||
|
.
|
||||||
.SS Indexes
|
.SS Indexes
|
||||||
Database entries can be
|
Entries can be
|
||||||
.I indexed
|
.I indexed
|
||||||
based on their attributes.
|
based on their attributes.
|
||||||
There are currently three main ways to search a value by its attributes: basic indexes, partitions and tags.
|
There are currently three main ways to search for a value by its attributes: basic indexes, partitions and tags.
|
||||||
.SSS Basic indexes (1 to 1 relation)
|
.
|
||||||
|
.SSS Basic indexes (1 to 1 relations)
|
||||||
Basic indexes represent one-to-one relations, such as an index in SQL.
|
Basic indexes represent one-to-one relations, such as an index in SQL.
|
||||||
For example, in a database of
|
In the Car database, each car has a dedicated (unique) name.
|
||||||
.I cars ,
|
|
||||||
each car can have a dedicted (unique) name.
|
|
||||||
This
|
This
|
||||||
.I name
|
.I name
|
||||||
attribute can be used to speed-up searches.
|
attribute can be used to speed-up searches.
|
||||||
On the file-system, this will be translated as this:
|
.QP
|
||||||
|
.SOURCE Ruby ps=10
|
||||||
|
# Create an index based on the "name" attribute of the cars.
|
||||||
|
cars_by_name = cars.new_index "name", do |car|
|
||||||
|
car.name
|
||||||
|
end
|
||||||
|
.SOURCE
|
||||||
|
Once the index has been created, every added or modified entry in the database will be indexed.
|
||||||
|
.QE
|
||||||
|
.
|
||||||
|
Adding an index (basic index, partition or tag) provides an object used to manipulate the database based on this index.
|
||||||
|
.QP
|
||||||
|
.SOURCE Ruby ps=10
|
||||||
|
# Retrieve the car named "Corvet".
|
||||||
|
corvet = cars_by_name.get? "Corvet"
|
||||||
|
|
||||||
|
# Modify the car named "Corvet".
|
||||||
|
new_car = Car.new "Corvet", "green", ["eco-friendly"]
|
||||||
|
cars_by_name.update "Corvet", new_car
|
||||||
|
|
||||||
|
# In case the index hasn't changed (the name attribute in this example),
|
||||||
|
# the update can be even simpler.
|
||||||
|
new_car = Car.new "Corvet", "green", ["eco-friendly"]
|
||||||
|
cars_by_name.update new_car
|
||||||
|
|
||||||
|
# Delete the car named "Corvet".
|
||||||
|
cars_by_name.delete "Corvet"
|
||||||
|
.SOURCE
|
||||||
|
A car can now be searched, modified or deleted based on its name.
|
||||||
|
.QE
|
||||||
|
.
|
||||||
|
.
|
||||||
|
On the file-system, indexes are represented as symbolic links.
|
||||||
.TREE1
|
.TREE1
|
||||||
storage
|
storage
|
||||||
+-- data
|
+-- data
|
||||||
| `-- 0000000000
|
| `-- 0000000000 <- the car named "Corvet"
|
||||||
`-- indexes
|
`-- indexes
|
||||||
`-- by_name
|
`-- by_name
|
||||||
`-- Ford C-MAX -> ../../data/0000000000
|
`-- Corvet -> ../../data/0000000000
|
||||||
.TREE2
|
.TREE2
|
||||||
As shown, the file "Ford C-MAX" is a symbolic link to a data file.
|
.QP
|
||||||
|
As shown, the file "Corvet" is a symbolic link to a data file.
|
||||||
The name of the symlink file has been extracted from the value itself, enabling to list all the cars and their names with a simple
|
The name of the symlink file has been extracted from the value itself, enabling to list all the cars and their names with a simple
|
||||||
.UL ls
|
.COMMAND ls
|
||||||
in the
|
in the
|
||||||
.I storage/indexes/by_name/
|
.DIRECTORY storage/indexes/by_name/
|
||||||
directory.
|
directory.
|
||||||
.TBD
|
.QE
|
||||||
|
.
|
||||||
|
The basic indexes as shown in this section already give a taste of what is possible to do with DODB.
|
||||||
|
The following indexes will cover some other usual cases.
|
||||||
|
.
|
||||||
|
.SSS Partitions (1 to n relations)
|
||||||
|
An attribute can have a value that is shared by other entries in the database, such as the
|
||||||
|
.I color
|
||||||
|
attribute in our cars.
|
||||||
|
.
|
||||||
|
.TREE1
|
||||||
|
db-cars
|
||||||
|
+-- data
|
||||||
|
| +-- 0000000000 <- this car is blue
|
||||||
|
| `-- 0000000001 <- this car is red
|
||||||
|
| ...
|
||||||
|
`-- partitions
|
||||||
|
`-- by_color
|
||||||
|
+-- blue
|
||||||
|
`-- 0000000000 -> 0000000000
|
||||||
|
`-- red
|
||||||
|
`-- 0000000001 -> 0000000001
|
||||||
|
.TREE2
|
||||||
|
.QP
|
||||||
|
Listing all the blue cars is simple as a
|
||||||
|
.COMMAND ls
|
||||||
|
in the
|
||||||
|
.DIRECTORY db-cars/partitions/by_color/blue
|
||||||
|
directory!
|
||||||
|
.QE
|
||||||
|
.
|
||||||
|
.SSS Tags (n to n relations)
|
||||||
|
Tags are basically partitions but the attribute can have multiple values.
|
||||||
|
.
|
||||||
.SECTION A few more options
|
.SECTION A few more options
|
||||||
.TBD
|
.TBD
|
||||||
.SECTION Limits of DODB
|
.SECTION Limits of DODB
|
||||||
|
@ -292,6 +405,7 @@ class Car
|
||||||
end
|
end
|
||||||
.SOURCE
|
.SOURCE
|
||||||
.
|
.
|
||||||
|
.
|
||||||
.SS Basic indexes (1 to 1 relations)
|
.SS Basic indexes (1 to 1 relations)
|
||||||
.LP
|
.LP
|
||||||
An index enables to match a single value based on a small string.
|
An index enables to match a single value based on a small string.
|
||||||
|
|
Loading…
Reference in New Issue