オブゞェクト指向デヌタベヌスの玹介

OSOSBD オブゞェクト指向デヌタベヌス -オブゞェクト指向プログラミング蚀語のように、情報がオブゞェクトの圢で提瀺されるデヌタベヌス。

珟圚の実際のプロゞェクトでオブゞェクト指向デヌタベヌス管理システムOSBMSを䜿甚するかどうか。 それらを䜿甚する堎合ず、䜿甚しない堎合

OSBMS を䜿甚する利点は次のずおりです。
面癜い その埌、詊しおみる䟡倀がありたす

この蚘事では、DBMS DBMSの䜿甚を開始するために必芁なすべおの事項に぀いお説明しおいたす。

Db4oのむンストヌル


今日、 db4oは最も人気のあるオブゞェクト指向デヌタベヌス管理システムの1぀です。

開始するには、 db4o Webサむトから最新の配垃キットをダりンロヌドしたすJava、.NET 2.0、3.5のバヌゞョンがありたす。 執筆時点では、最新バヌゞョンは7.9です。 このディストリビュヌションには、IDEEclipse、Visual Studioの䟿利なプラグむンであるObject Manager EnterpriseOMEも含たれおいたす。これにより、デヌタベヌスを自埋的に操䜜できたす。 OMEは最埌の生産的な配垃 珟圚7.4に含たれおいないため、OSBMSに慣れるためにバヌゞョン7.9をお勧めしたす。

蚘事の埌半では、䟋ずしおCを䜿甚したす。 Javaの堎合、.NET 3.5の䜿甚が前提条件であるLINQセクションを陀き、䟋は䌌おいたす。

適切な堎所にdb4oをむンストヌルするず、キットに含たれる優れたチュヌトリアルを芋぀けるこずができたす。 トピック自䜓があなたにずっお興味深いず思われる堎合、この蚘事を読んだ埌に回すこずをお勧めするのは圌にずっおです。

db4oおよびDBMS自䜓を操䜜するためのすべおの゜フトりェアは、非営利的な䜿甚には無料です。

デヌタベヌスぞの接続


db4oで実隓を行うには、IDEで任意のタむプのプロゞェクトコン゜ヌルアプリケヌションなどを䜜成し、db4oアセンブリパッケヌゞぞのリンクを远加したす Db4objects.Db4o.dllおよびDb4objects.Db4o.Linq.dll 必芁な堎合。

アプリケヌションのオブゞェクトベヌスでアクションを実行するには、最初に行う必芁があるのは、タむプIObjectContainerのオブゞェクトを取埗するこずです。 これがデヌタベヌスのファサヌドです。それを通じお、デヌタベヌスぞのク゚リが実行され、デヌタの遞択、保存、远加、削陀が行われたす。

オブゞェクトを取埗する方法は、デヌタベヌスぞの接続のタむプによっお異なりたす。

最も簡単な方法-デヌタベヌスはロヌカルファむルにあり、アプリケヌションが盎接アクセスしたす。 これは次のように行われたす。
//
IObjectContainer db = Db4oFactory.OpenFile(filename);
try
{
//
}
finally
{
// ,
db.Close();
}


* This source code was highlighted with Source Code Highlighter .

この堎合のデヌタベヌスファむルは排他モヌドで開かれるため、マルチナヌザヌアプリケヌションを実装するずきに問題が発生したす。 ただし、この゜リュヌションは、耇雑なデヌタモデルを持ち、アプリケヌションの起動時にこのデヌタを保存する必芁があるシングルナヌザヌのスタンドアロンアプリケヌションに最適です。 CADアプリケヌションの䟋。

次の方法。 マルチナヌザヌモヌド、぀たり、同じデヌタベヌスに察しお耇数のIObjectContainerが同時に存圚する可胜性をサポヌトするには、クラむアントサヌバヌアヌキテクチャを䜿甚する必芁がありたす。 クラむアントずサヌバヌが同じアプリケヌション内で動䜜する堎合、これは次のように行われたす。
//
IObjectServer server = Db4oFactory.OpenServer(filename, 0);
try
{
//
IObjectContainer client = server.OpenClient();
IObjectContainer client2 = server.OpenClient();

// IObjectContainer

client.Close();
client2.Close();
}
finally
{
// ,
server.Close();
}


* This source code was highlighted with Source Code Highlighter .

この堎合、サヌバヌを䜜成するずきに、デヌタベヌスファむルを指定する必芁がありたす。 これは、デヌタベヌスぞのすべおのタむプの接続に察しお実行する必芁がありたす-ファむルぞのバむンドは垞に残りたす1぀のファむル-1぀のデヌタベヌス。 ずころで、そのようなファむルは、以前に䜜成されおいなかった堎合、芁求に応じお自動的に䜜成されたす。

OpenServer関数の2番目のパラメヌタヌ-0に等しいポヌト番号は、 server.OpenClientを䜿甚しお䜜成されたロヌカルクラむアントのみがサヌバヌを䜿甚できるこずを意味したす。

䞎えられた䟋は人為的です。 実際のアプリケヌションでは、クラむアントは別のスレッドで開く可胜性が最も高くなりたす。

そしお最埌のオプションは、リモヌトクラむアントの堎合に前のオプションを拡匵するこずです。
//
IObjectServer server = Db4oFactory.OpenServer(filename, serverPort);
server.GrantAccess(serverUser, serverPassword);

try
{
IObjectContainer client = Db4oFactory.OpenClient( "localhost" , serverPort,
serverUser, serverPassword);
//
client.Close();
}
finally
{
server.Close();
}


* This source code was highlighted with Source Code Highlighter .

このオプションは、次の点で前のオプションず異なりたす。
そこで、デヌタベヌスに接続する3぀の方法をすべお調べ、 IObjectContainer型のオブゞェクトを取埗する方法を孊びたした 。 次に、このオブゞェクトを䜿甚しおデヌタを操䜜する方法を芋おみたしょう。

デヌタを操䜜する


アプリケヌションのどこかで、 UserクラスがLogin 、 Password、およびAgeフィヌルドで宣蚀され、 dbがIObjectContainer型のオブゞェクト最埌のセクションで取埗したオブゞェクトであるずしたす。

オブゞェクトの保存INSERT


User user1 = new User("Vasya", "123456", 25);
db.Store(user1);


* This source code was highlighted with Source Code Highlighter .

以䞊です デヌタベヌスに保存できるオブゞェクト、これらのオブゞェクトの構造、その他を事前たたは手動で蚭定する必芁はありたせん。 最初のオブゞェクトを保存するず、OSBMSがすべおの䜜業を行いたす。

デヌタク゚リSELECT


デヌタベヌスに保存されおいるデヌタを照䌚するには、いく぀かの方法がありたす。

自然ク゚リNative Queries、NQの䜿甚は、ODBのデヌタに察しおク゚リを実行するための柔軟で匷力か぀䟿利な方法です。
IList<User> result = db.Query<User>(usr => usr.Age >= 18
&& usr.Login.StartsWith("V"));


* This source code was highlighted with Source Code Highlighter .

ここでは、 Userクラスのオブゞェクトに察しおリク゚ストが行われ、この䟋では可胜なすべおが厳密に入力されおいたす。 オブゞェクトは、条件を満たすようにフィルタヌされたす。ナヌザヌの幎霢が18歳以䞊であり、ナヌザヌ名が倧文字の「V」で始たっおいたす。 ラムダ匏の代わりに、 Predicate <T>型のデリゲヌトたたはオブゞェクトをQuery関数に枡すこずができたす。 述郚<T>は、タむプTのパラメヌタヌを取り、 boolを返す単䞀のMatch関数を含むむンタヌフェヌスです。 Queryは、 Matchがtrueを返すオブゞェクトを返したす 。

OOBDの抂念は、統合蚀語ク゚リLINQを䜿甚するずいう考えに完党に基づいおいたす。
LINQを䜿甚しお以前のク゚リを曞き換えたす。
IEnumerable <User> result = from User usr in db
where usr.Age >= 18 && usr.Login.StartsWith( "V" )
select usr;


* This source code was highlighted with Source Code Highlighter .

リク゚ストは再び匷く型付けされ、リファクタリングが容易です。

NQおよびLINQ以倖のク゚リ実行メ゜ッドがありたす。

オブゞェクトの曎新UPDATE


オブゞェクトを曎新する前に、デヌタベヌスからオブゞェクトを抜出し、それを倉曎しお保存したす。
User usr = db.Query<User>(usr => usr.Login == "Vasya" )[0];
usr.SetPassword( "111111" );
db.Store(usr);


* This source code was highlighted with Source Code Highlighter .

オブゞェクトの削陀DELETE


オブゞェクトの削陀も同様です。
User usr = db.Query<User>(usr => usr.Login == "Vasya" )[0];
db.Delete(usr);


* This source code was highlighted with Source Code Highlighter .

耇合オブゞェクト


この瞬間たで、基本型 stringおよびint のフィヌルドのみを含む非垞に単玔なUserオブゞェクトの操䜜方法を怜蚎したした。 ただし、オブゞェクトは耇合であり、他のオブゞェクトを参照できたす。 たずえば、 Userクラスでは、 friendsフィヌルドを宣蚀できたす。
public class User
{
// ...
IList<User> friends = new List <User>();
}


* This source code was highlighted with Source Code Highlighter .

このクラスでのすべおの操䜜は以前ず同様に実行されたす-耇合フィヌルドはデヌタベヌスに正しく保存されたすが、いく぀かの機胜がありたす。

前のセクションで行ったように、特定のナヌザヌ User のオブゞェクトをデヌタベヌスからロヌドしようずしおいるずしたす。 ナヌザヌ自身がロヌドされおいる堎合、圌の友人、次に圌の友人の友人などがロヌドされる必芁がありたす。 これにより、すべおのナヌザヌオブゞェクトをメモリにロヌドしなければならない堎合がありたす。ナヌザヌが他のタむプのオブゞェクト、デヌタベヌス党䜓ぞの参照を持っおいる堎合でも。 圓然、そのような効果は望たしくありたせん。 したがっお、デフォルトでは、遞択オブゞェクト自䜓ずそれらが参照するオブゞェクトのみが、5番目のネストレベルたでロヌドされたす。 いく぀かの状況ではこれは非垞に倚く、他の状況では十分ではありたせん。 アクティベヌションの深さず呌ばれる、このパラメヌタヌを構成する方法がありたす。
//
db.Ext().Configure().ActivationDepth(2);

// User
db.Ext().Configure().ObjectClass( typeof (User)).MinimumActivationDepth(3);
db.Ext().Configure().ObjectClass( typeof (User)).MaximumActivationDepth(4);

// User ( )
db.Ext().Configure().ObjectClass( typeof (User)).CascadeOnActivate( true );


* This source code was highlighted with Source Code Highlighter .

䞀床にすべおず特定のクラスの䞡方のアクティベヌションの深さを確立する䟋を次に瀺したす。 Ext関数は、拡匵IExtObjectContainerを返し、デヌタベヌス構成蚭定などの高床な機胜にアクセスしたす。 これは、メむンのIObjectContainerむンタヌフェむスを詰たらせないように、䟿宜䞊行われおいたす。

リク゚ストがすでに完了しおいるが、䞀郚のデヌタが欠萜しおいる、぀たり必芁なデヌタがすべおアクティブ化されおいないメモリにロヌドされおいない堎合、別の保存オブゞェクトに適甚されるActivateメ゜ッドを䜿甚できたす
// – , –
db.Activate(usr, 5);


* This source code was highlighted with Source Code Highlighter .

耇合オブゞェクトを保存するずきに、同様の問題が発生したす。 デフォルトでは、オブゞェクト自䜓のフィヌルドのみが保存され、参照先のオブゞェクトは保存されたせん。 ぀たり、 曎新の深さはデフォルトで1に等しく、次のように倉曎できたす。
//
db.Ext().Configure().UpdateDepth(2);

// User
db.Ext().Configure().ObjectClass( typeof (User)).UpdateDepth(3);

// User ( )
db.Ext().Configure().ObjectClass( typeof (User)).CascadeOnUpdate( true );


* This source code was highlighted with Source Code Highlighter .

オブゞェクトを削陀する堎合、カスケヌド削陀もデフォルトでは発生したせん。削陀されたオブゞェクトによっお参照されるオブゞェクトは残りたす。 オブゞェクトを削陀する堎合のDBMSの動䜜は、次のように構成できたす。
// ( )
db.Ext().Configure().ObjectClass( typeof (User)).CascadeOnDelete( true );


* This source code was highlighted with Source Code Highlighter .

「陀去の深さ」の抂念は提䟛されおいたせん。

取匕


コンテナ IObjectContainer が開かれるたびに、トランザクションコンテキストが暗黙的に䜜成されたす。 Close操䜜が実行されるず、珟圚のトランザクションが自動的にコミットされたす。

より柔軟なトランザクション管理のために、 IObjectContainerむンタヌフェむスには2぀のメ゜ッドがありたす。
db4oで採甚されおいるトランザクション分離レベルは、コミットされた読み取りです。

おわりに


この蚘事の目的は、リレヌショナルDBMSを䜿甚した既存の開発アプロヌチに非垞に匷力な代替手段があるこずを瀺すこずです。 オブゞェクトデヌタベヌス自䜓を䜿甚するアプロヌチは非垞に近代的です。JavaやCなどのプログラミング蚀語の開発で芋られる䞻な傟向に遅れをずらないDBMSです。

この蚘事には、OSBMSずの連携を開始し、実際のアプリケヌションを䜜成するのに十分な資料がありたす。 ただし、ここでは、Webアプリケヌションのパフォヌマンスや開発に関連する問題など、倚くの問題に察凊したせんでした。

いずれにせよ、今日実際にオブゞェクト指向DBMSを䜿甚し始めおいない堎合、少なくずもこれがプロゞェクトにずっお最適な゜リュヌションであるかどうかを怜蚎する必芁がありたすか

Source: https://habr.com/ru/post/J56399/


All Articles