Hermetyzowanie wielu baz danych za pomocą warstwy pamięci

Teraz, gdy opracowaliśmy nasz interfejs Database i naszą implementację CSVFiles takiego interfejsu, jesteśmy gotowi do opracowania kolejnej warstwy abstrakcji, naszej klasy Storage. Zostanie zaimplementowany z R6. Jak widać, konstruktor Stroage zaimplementowany w funkcji initialize otrzymuje obiekt settings, który będzie pełnym scentralizowanym plikiem ustawień, wspominając i będą używać części storage/read, storage/write, i storage/table do tworzenia różnych instancji bazy danych za pomocą funkcji database_factory(), którą wyjaśniliśmy wcześniej. W przypadku atrybutu read_db będzie to pojedyncza implementacja Database, która będzie używana do odczytu danych. W przypadku atrybutu write_db ​​jak sama nazwa wskazuje, będziemy mieli listę implementacji Database, w których wszystkie dane, które mają być zapisane przez inne obiekty, będą przechowywane. Dzięki tej abstrakcji Storage możemy po prostu wysłać ją do obiektów szukających obiektu podobnego do bazy danych do zapisywania i odczytywania danych, a ona zajmie się replikacją danych w razie potrzeby, jak również dostarczeniem danych do wspomnianych obiektów. Aby to osiągnąć, można poprosić, aby w przypadku metod read po prostu delegował zadanie do implementacji Database  zawartej w jego atrybucie read_db, a w przypadku metody write, robi to samo dla każdej implementacji Database w jej atrybucie write_dbs. To takie proste:

soure(„./database-factory.R”)

Storage <- R6Class (

„Storage”,

public = list (

initialize = function(settings) {

private$read_db <- database_factory (

settings[„storage”]] [[„read”]],

settings[[„storage”]][[„tables_names”]]

)

private$write_dbs <- lapply(

settings[[„storage”]] [[„”write”]],

database_factory,

settings[[„storage”]][[„tables_names”]]

)

).

read_exchanges = function() {

return(private$read_db$read_exchanges() }

),

read_users = funtion() {

return(private$read_db$read_users(self))

),

read_wallets = function(email) {

return(private$read_db$read_wallets(email))

),

read_all_wallets = function() {

return(private$read_db$read_all_wallets() )

),

read_analysis_assets = function(email) {

return(private$read_db$read_analysis_assets(email))

),

write_user = function(user) {

for (db in private$write_dbs) { db$write_user(user) }

),

write_wallets = function(wallets) {

for (db in private$write_dbs) { db$write_wallets(wallets) }

),

write__assets = function(assets) {

for (db in private$write)dbs)  { db$write_assets(assets) }

},

write_markets = function(markets) {

for (db in private$write_dbs) { db$write_markets(markets) }

},

),

private = list(read_db = NULL, write_dbs = list () )

)

To wszystko w przypadku naszych abstrakcji pamięci masowej. W tym momencie zaimplementowaliśmy interfejs Database, implementację CSVFIles wspomnianego interfejsu i warstwę Storage, która umożliwia użycie wielu implementacji Database jednocześnie i odsprzęga dla nas obiektów odczytu i zapisu. Moglibyśmy zdecydować się na użycie jednego typu bazy danych do operacji odczytu i innego do operacji zapisu i mieć jakiś rodzaj zewnętrznego mechanizmu synchronizowania ich razem poza R. Może to być przydatne na przykład ze względu na wydajność.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *