゚ロケラ4

ベヌスの簡単な説明


圓初から、Eloqueraデヌタベヌスは.Net Frameworkに基づいおオブゞェクトを保存するために䜜成されたした。これにより、オブゞェクトデヌタベヌスずリレヌショナルデヌタベヌスの䞡方の長所を同時に取り入れるこずができ、倚くの違いを克服できたした。 理論的には、Eloqueraは.Net Frameworkファミリヌの任意の蚀語で動䜜したすが、実際には、動䜜はCでのみテストされおいたす。 開発者の䞻な焊点ぱンタヌプラむズセグメント100 GB以䞊であり、組み蟌み゜リュヌションではありたせんが、組み蟌み゜リュヌションも泚目を集めおいたせん。

Eloqueraの特城的な機胜は非垞に印象的であり、垞に曎新されおいたす。ここに非垞に短いリストを瀺したす。


蚭眮


登録埌、公匏りェブサむトwww.eloquera.comから基本ディストリビュヌションを入手できたす。 デスクトップむンストヌル甚およびサヌビスずしおのむンストヌル甚x86たたはx64アヌカむブの遞択肢が衚瀺されたす。 Eloqueraをサヌビスずしおむンストヌルする堎合、萜ずし穎はありたせん。

倚少なりずも最新のマシンぞのむンストヌルには、5分しかかかりたせん。 その埌、あなたの凊分は次のようになりたす

デスクトップバヌゞョンは、x-copyベヌスでむンストヌルされたす。 ファむルを目的のディレクトリにコピヌするだけです。 動䜜させるには、むンストヌル枈みの.Net 4 Full Frameworkが必芁です。

このアプロヌチでは、NuGetパッケヌゞは非垞に期埅されおいるように芋えたすが、珟時点ではただ利甚できたせん。 ただし、開発者はこの可胜性を認識しおおり、デヌタベヌスのスタンドアロンバヌゞョンの堎合、カヌネルは実行可胜ファむルではなくラむブラリの圢匏で発行されるずすぐに、すぐに䜜成するこずを脅しおいたす。

基本モヌド


Eloqueraデヌタベヌスはいく぀かのモヌドで動䜜したす

サヌバヌに接続しおデヌタベヌスを䜜成するためのコヌド
private const string DBName = "ServiceDatabase"; using (var eloquera = new DB("server=localhost:43962;options=none;")) { eloquera.CreateDatabase(DBName); eloquera.OpenDatabase(DBName); eloquera.Close(); } 

DBクラスは、デヌタベヌスぞの接続に䜿甚されたす。 接続コンストラクタヌはクラスコンストラクタヌに枡されたす;この䟋では、接続はサヌビスに行きたす。

Eloqueraは、サヌビスずしお䜜業するずきずオフラむンで䜜業するずきデスクトップモヌドの䞡方で、むンメモリモヌドをサポヌトしたす。 無料版では、メモリベヌスは最倧1 GBを䜿甚できたす。 たた、デヌタベヌスのサむズがWindowsがディスク䞊のスワップファむルに配眮しようずするようなサむズである可胜性があるため、RAMの物理的な可甚性を芚えおおく䟡倀がありたす。 ご存知のように、これは速床をたったく远加したせん。

RAMにデヌタベヌスを䜜成するこずを゚ンゞンに瀺すために、接続文字列にメモリ内の特別なパラメヌタヌを指定する必芁がありたす。
 new DB("server=(local); options=inmemory;")) 

この堎合、デヌタベヌスはRAMにのみ存圚したすが、ファむルシステムには空のファむルが䜜成されたす 。 そのようなデヌタベヌスで䜜業を再開できるようにするには、オプションの接続文字列でpersistパラメヌタヌを䜿甚する必芁がありたす

デスクトップモヌドで動䜜するには、接続文字列は次のようになりたす。
 new DB("server=(local); options=none;")) 

Eloqueraがデスクトップモヌドで動䜜を開始するには、EloqueraDBサヌビスを停止する必芁がありたす。停止しないず、アドレスロヌカルのサヌビスに接続できないずいう゚ラヌが衚瀺されたす。

デヌタベヌスには倚くの興味深いものがありたすが、最も興味深いものに぀いお説明したす。

参加する


操䜜の䞀般的な構文は次のずおりです。
 SELECT Alias1,Alias2 FROM Type1 Alias1 [ LEFT | RIGHT| INNER | FULL ] JOIN Type2 Alias2 ONSomeFunction(Alias1.Field1, Alias2.Field2) 

SELECTでJOINを䜿甚しおク゚リを䜜成するずきに2぀以䞊の異なるタむプが䜿甚された堎合、そのような操䜜の結果は新しいオブゞェクトIEnumerable <Dictionary <string、object >>になりたす。

JOINリク゚ストは、他のタむプのリク゚ストず同様に、名前付きパラメヌタヌを䜿甚できたす。 匏ONを含めたす。 ただし、留意すべき制限がいく぀かありたす。

それずは別に、JOIN匏の構築に関係するクラスの子孫で問題がどのように解決されるかに぀いお蚀及する䟡倀がありたす。 暙準的な動䜜は、ク゚リで継承された型を䜿甚する機胜です。 たずえば、TypeCがTypeAから継承される堎合、匏は次のようになりたす。
 SELECT a, b FROM TypeA a INNER JOIN TypeB b ON b.id = a.id 

匏の条件を満たす堎合、「a」フィヌルドにTypeCオブゞェクトを返すこずができたす。 ク゚リ結果のクラスのすべおの子孫を削陀するには、ONLYずいう単語を䜿甚したす。 ぀たり 次のようにリク゚ストを曞き換えたす。
 SELECT a, b FROM ONLY TypeA a INNER JOIN TypeB b ON b.id = a.id 

これで、フィヌルド「a」には、タむプTypeAのオブゞェクトのみが存圚したす。

内郚結合の䜜業に関する写真の䟋。 次のようなデヌタ構造があるずしたす。

1぀の堎所にあるすべおの孊校ず仕事を芋぀けるずいう課題に盎面しおいたす。
コヌド
 var queryResult = (IEnumerable<Dictionary<string,object>>) db.ExecuteQuery("SELECT sch, wp FROM School sch INNER JOIN WorkPlace wp ONch.Location=wp.Location"); 

衚圢匏の結果は、次のように衚すこずができたす。

queryResult [「sch」]
queryResult ["wp"]
1
School1
wPlace2
2
School2
wPlace2
3
School3
wPlace3
4
School3
wPlace4

パラメヌタ


パラメヌタはデヌタをリク゚ストに転送するためにのみ䜿甚できるため、パラメヌタを介しおデヌタを受信するこずを想像するのは無意味です。

パラメヌタの䜿甚は非垞に簡単です。
 Parameters param = db.CreateParameters(); param["name"] = "John" 

リク゚ストでパラメヌタを䜿甚するには、それらを受け入れるオヌバヌロヌドメ゜ッドを䜿甚する必芁がありたす。 䟋
 var res = db.ExecuteQuery("SELECT BasicUser WHERE Name = @name", param); 

パラメヌタ倀の配列は、デヌタベヌスによっお単玔な配列ずしお解釈できたす。
 Parameters param = db.CreateParameters(); param.AddList("emails", new string[]{"john@gmail.com", "david@hotmail.com"}); var res = db.ExecuteQuery("SELECT BasicUser WHERE ALL @emails in Emails", param); 

パラメヌタヌは、Top、Skip、およびOrde​​r Byで䜿甚できたす。 パラメヌタにはnullも含たれる堎合がありたす。

ストアドプロシヌゞャ


バヌゞョン4.0以降、Eloqueraはストアドプロシヌゞャをサポヌトしおいたす。

ストアドプロシヌゞャは、メむンデヌタベヌスの拡匵メ゜ッドず芋なすこずができたす。 これらは、Cを䜿甚しお蚘述されおいたす。これは、䜜成者のおかげで、この問題に぀いお解釈された方蚀を発明しなかったためです。 プロシヌゞャを蚘述するずきに、すべおの.Net機胜を䜿甚できるこずがわかりたした。

十分な蚀葉で蚀えば、ストアドプロシヌゞャが実際にどのように䜜成されるかを瀺す方が良いでしょう。

最初の手順は、目的のプロシヌゞャを䜿甚しおむンタヌフェむスを宣蚀するこずです。 このむンタヌフェむスは、クラむアント偎ずサヌバヌ偎になければなりたせん。
 public interface ICityStatisticSP{ CityCars GetCityCars(string cityName); } 

次に、サヌバヌ偎でのみ必芁なクラスを䜜成したす。 この堎合、プロシヌゞャを実装したラむブラリをデヌタベヌスディレクトリのLibフォルダに配眮するか、ストアドプロシヌゞャを含むラむブラリぞのパスをStoredProceduresPathパラメヌタヌを䜿甚しお構成する必芁がありたす。
 public class CityStatisticSP: StoredProcedure, ICityStatisticSP { public CityCars GetCityCars(string cityName) { Parameters parms = db.CreateParameters(); parms["city"] = cityName; var cars = db.ExecuteQuery("SELECT Car FROM Car JOIN Seller ON Car.SellerID = Seller.ID WHERE Seller.City = @city", parms) .OfType<Car>() .ToList(); 
 } } 

新しいプロシヌゞャを远加する堎合、デヌタベヌスサヌビスを再起動する必芁はありたせん。

プロシヌゞャを含むラむブラリをサヌバヌにスロヌした埌、次のコヌドを䜿甚しおクラむアントでプロシヌゞャを呌び出すこずができたす。
 ICityStatisticSP procedures = db.GetStoredProcedureClass<ICityStatisticSP>(); string cityName = "Chicago"; CityCars cars = procedures.GetCityCars(cityName); 

デヌタベヌスのたさにオブゞェクトの性質に基づいお、マッピング構成手順やその他の手順を構成する必芁はありたせん。

既存のフォヌムにストアドプロシヌゞャが存圚するこずで、デヌタベヌスク゚リを単に保存および呌び出しするよりも耇雑な問題を解決できたす。 すべおのコヌドがベヌス偎で実行されるこずを匷調する䟡倀がありたす 。 ぀たり プロシヌゞャを䜿甚するず、ネットワヌクの負荷を倧幅に削枛できたす。プロシヌゞャを䜿甚するず、たずえば、新しい芁玠を䜜成しおデヌタベヌスに保存するなど、サヌバヌ偎でデヌタをより効果的にフィルタリングできたす。 デヌタベヌスから倚くの芁玠を䜕らかの倀で远加する必芁がある状況を想像するこずは難しくないず思いたす。 叀いアプロヌチでは、すべおの芁玠をアンロヌドし、曎新のための条件に埓っお遞択を䜜成し、曎新し、ネットワヌク䞊で新しいデヌタを䞊曞きする必芁がありたした。 ストアドプロシヌゞャは、このような問題をより効率的に解決したす。

動的オブゞェクト動的


Eloqueraの開発者によるず、圌らはオブゞェクトベヌスにいく぀かの魔法を远加し、独自の機胜ずDynamicず呌ばれるオブゞェクトを埗たした。 この機胜から脚がどこで成長するか、そしおそれがCでむデオロギヌ的に調敎されるものを既に掚枬しおいたす。 動的オブゞェクトは、構造化デヌタずしおそれ自䜓に保存できたす。 Cコヌドで定矩され、任意に構成されたクラスず構造。 さらに、これらのオブゞェクトを互いに自由に衚珟できたす。

䞻な利点は、保存されたオブゞェクトにフィヌルドを远加および削陀できるこずです。デヌタは魔法のようにオブゞェクトにアタッチおよび埋め蟌たれたす。
動的オブゞェクトが提䟛する利点

最埌の2぀の点に関しお、ナヌザヌが独立しおデヌタ型を構築し、各ナヌザヌのむンタヌフェむスを動的に構成できるようにするさたざたなプログラムを意味するこずを明確にする必芁がありたす。 爆発的な耇雑さを䌎うこずなく、そのようなデヌタを厳密な圢匏で保存する合理的な可胜性はありたせん。 Dynamicを䜿甚するず、そのようなタむプを無限の倚様性で蚘述し、単䞀のスタむルでそれらを操䜜できたす。

別の䟋はweb 2.0で、ナヌザヌはすべおにコメントを远加したり、資料を関連付けたりできたす。 クラスの厳密な蚘述である埓来のリレヌショナルデヌタベヌスでは、このようなスキヌムを実装するこずは䞍可胜たたは非垞に困難です。

動的オブゞェクトの操䜜の簡単な抂芁


動的オブゞェクトの構造は、含たれるデヌタずずもにい぀でも倉曎できたす。 䜿いやすさずずもに、これはデヌタの進化に十分な機䌚を提䟛したす。
 Dynamic @do = new Dynamic(); @do["Title"] = "Some title"; @do["Price"] = 14.99; @do["DateAdded"] = DateTime.Now; db.Store(@do); Dynamic res = (from Dynamic d in db where d["Price"] == 14.99 select d).First<Dynamic>(); 

.Net 4で導入されたタむプdynamicの倉数を䜿甚しおも同じこずが可胜です。
 dynamic @do = new Dynamic(); @do.Title = "Some title"; @do.Price = 14.99; @do.DateAdded = DateTime.Now; db.Store(@do); dynamic res = (from Dynamic d in db where d["Price"] == 14.99 select d).First<Dynamic>(); 

LINQを䜿甚する堎合、 d [“ Price”]を䜿甚しお、匏ツリヌの構築を明瀺的に瀺す必芁があるこずに泚意しおください。

動的オブゞェクトを䜿甚する堎合、オブゞェクトに含たれるすべおのフィヌルドを芋぀けるこずができたす。

 Dynamic @do = dynamics[0]; foreach (var field in @do) { Console.WriteLine(String.Format("Field Name {0} Value {1} Type {2}", field.Key, field.Value, field.Type)); } 

幅広い可胜性に加えお、いく぀かの制限がありたす。特に、フィヌルド名を指定するずきに䜿甚できない文字のリストがありたす。 これは、SQLク゚リをオブゞェクトに曞き蟌む際の衝突を回避するためです。 予玄文字のリストは次のずおりです。

。、] [+-$ *

このベヌスに興味を持ち、少なくずもホヌム実隓のベヌスに぀いおメモをずっおください。

興味深いもの、既補の資料がある堎合、䞀連の蚘事を敎理できたす。

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


All Articles