Mechanism for data storage
PHP
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src/RiuDB
README.md

README.md

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