Skip to content

Riu/riudb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 

Repository files navigation

RiuDB

Mechanizm składowania danych dla systemów zarządzania treścią.

UWAGA! Dokumentacja poniżej jest krótkim przewodnikiem dla wersji 1.0.

Wstęp

RiuDB to koncept zarządzania i archiwizowania informacji za pomocą plików JSON i relacyjnych baz danych. Bezpośrednią inspiracją do jego stworzenia były porównania możliwości relacyjnych i nierelacyjnych baz danych w kontekście tworzenia aplikacji społecznościowych takich jak Facebook, czy G+.

Opis

RiuDB działa w oparciu o koncepcje unikalnych identyfikatorów - podobnie jak w MongoDB każdy rekord zapisywany do bazy MySQL otrzymuję unikalny id. Oprócz tego w bazie przetrzymywane jest informacja (moduł) definiowana przez programistę - czym ma być dany rekord np: tagiem, wpisem na forum, użytkownikiem. (o powstawaniu koncepcji można przeczytać tutaj - http://forum.kohanaphp.pl/index.php/topic,961.0.html )

Przykładowa tabela danych:

CREATE TABLE IF NOT EXISTS `records` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `module` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `module` (`module`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;

Każda następna tabela w bazie powinna zawierać powiązanie do id i określone dane, które chcemy posiadać w danym module. Przykładowa tabela tagów:

CREATE TABLE IF NOT EXISTS `tags` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `record` int(10) unsigned NOT NULL,
  `slug` varchar(128) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `record` (`record`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;
ALTER TABLE `tags`
  ADD CONSTRAINT `tags_ibfk_1` FOREIGN KEY (`record`) REFERENCES `records` (`id`) ON DELETE CASCADE;

W momencie gdy dodajemy za pomocą insert nowy rekord do records zwracany jest jego id i dopiero wtedy dodajemy tag gdzie zwrócone records.id=tags.record. Analogicznie możemy w ten sam sposób dodawać posty na blogu, użytkowników, kategorie - zawsze elementem łączącym będzie record. Między poszczególnymi rekordami oczywiście będą występować relacje np.: post będzie miał wiele tagów i będzie stworzony przez jakiegoś użytkownika.

Ideą RiuDB jest tworzenie dokumentu zawierającego dane z danego modułu podobnie jak w mongo lecz z wykorzystaniem relacyjności baz danych:

  • zapis danych do bazy mysql
  • zapis danych z mysql do json
  • odczyt tylko relacji między rekordami z wykorzystaniem mysql
  • odczyt właściwych danych bez połączenia z bazą danych

W koncepcji tej MySQL służy tylko do pobrania określonej warunkami grupy identyfikatorów, na podstawie których pobrane zostaną informacje z dokumentów przypisanych do tych identyfikatorów. Relacje te zapisujemy również w samych dokumentach, co powoduje, że w do odczytania dokumentu o określonym id nie potrzebujemy łączyć się bazą - nie musimy również łączyć się bazą aby odczytać z jakimi innymi dokumentami jest on powiązany. Ewentualne zapytania z użyciem JOIN w bazie MySQL operują jedynie na danych typu int z wykorzystaniem indeksów.

Każdy dokument magazynowany jest w strukturze modul/XX/XX/XX/XX/id.json gdzie z id tworzony jest liczba traktowana jest jako string po którego rozbiciu otrzymujemy foldery będące ścieżką do pliku dokumentu. W ścieżce tej możemy również tworzyć foldery o określonym id w którym przetrzymujemy dane związane z dokumentem. Domyślnie moduł to records, lecz można mieć wiele tabel takich jak records.

Przykłady

$id - pojedynczy dokument (int) $array - tablica złożona z id dokumentów $data - dane zapisywane do dokumentu (array)

-dodawanie pliku dokumentu $id, bez folderu, plik bez danych, dane domyślnie zakodowane w jsonie

Riudb::factory()->id($id)->add();

-dodawanie pliku dokumentu $id, z folderem $id, plik z danymi niezakodowany w json

Riudb::factory()->id($id)->add(TRUE, 'coś');

-dodawanie pliku poddokumentu do folderu głównego,plik z danymi niezakodowany w json

Riudb::factory()->id($id)->addfile('plik','tekst');

-dodawanie pliku poddokumentu do folderu głównego,plik z danymi niezakodowany w json, dodanie podfolderu do folderu dokumentu

Riudb::factory()->id($id)->addfile('plik','tekst')->addfolder('mini');

-dodawanie pliku dokumentu z folderem, poddokumentem, podfolderami

Riudb::factory()->id($id)->add(TRUE)->addfile('plik','tekst')->addfolder('mini')->addfolder('medium');

-usunięcie pliku dokumentu

Riudb::factory()->id($id)->delfile();

-usunięcie pliku poddokumentu

Riudb::factory()->id($id)->delfile('plik');

-usunięcie podfolderu folderu głównego dokumentu

Riudb::factory()->id($id)->deldir('mini');

-usunięcie folderu głównego dokumentu

Riudb::factory()->id($id)->deldir();

-dodawanie pliku dokumentu $id, z folderem $id, plik z danymi niezakodowany w json dla modułu users

Riudb::factory('users')->id($id)->add(TRUE);

-pobranie ścieżki do danego dokumentu

Riudb::factory()->id($id)->getpath();

-pobranie dokumentu id z dołączeniem do niego dokumentu określonego w wartości parent

Riudb::factory()->get($id)->join('parent')->render();

-pobranie dokumentów o użytkownikach posiadających id z tablicy $array

Riudb::factory('users')->get($array)->render();

-zapisywanie tablicy danych do dokumentu

Riudb::factory()->id($id)->save($data);

-pobranie: dokumentu o identyfikatorze $id, dokumentu o identyfikatorze $parent dla $id, dokumentu o identyfikatorze $user dla $id, pobranie dwóch komentarzy wraz ich autorami i odwróceniem ich w odwrotnej kolejności.

Riudb::factory()->get($id)->join('parent')->join(array('user','users'))->join('comments',array('user','users'),2,TRUE)->render();

Zastosowanie

Klony Facebooka/Google+.

ToDo

  • zapisywanie nowych "kolumn" do dokumentów
  • zagnieżdżone relacje dla więcej niż jednego dokumentu.

Licencja

http://www.gnu.org/licenses/gpl-3.0.txt

Uwagi

  • projekt we wczesnej wersji alfa ;)
  • dla poprawnego działania trzeba zadeklarować DBPATH - czyli folder gdzie będą składowane dane

Kontakt z autorem

About

Mechanism for data storage

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages