einfügen von komplexen Objekten zu azure-Tabelle mit TableServiceEntity
Ich wurde erwägt, eine ganze komplexe Objekt in eine Tabelle ein. Aus der guten alten SQL-Ansatz, den ich hatte offensichtlich die Trennung von diesem in Tabellen, aber ich versuche einen anderen Ansatz. Grundsätzlich habe ich damit ein Objekt, das aus einer geschachtelten Klasse (Art eine Sache, die Sie erhalten, wenn Sie deserialise ein json-Sammlung), die üblichen Kunden -, Unternehmens-und eine Liste von InvoiceItems.
public class Business
{
public string _id { get; set; }
public string name { get; set; }
public string street_1 { get; set; }
public string street_2 { get; set; }
public string town { get; set; }
public string county { get; set; }
public string postcode { get; set; }
//other fields as needed
}
public class Customer
{
public string _id { get; set; }
public string name { get; set; }
public string street_1 { get; set; }
public string street_2 { get; set; }
public string town { get; set; }
public string county { get; set; }
public string postcode { get; set; }
//other fields as needed
}
public class InvoiceItems
{
public string item_id { get; set; }
public string price_per_unit { get; set; }
public string quanity { get; set; }
public string date { get; set; }
}
public class WholeObject
{
public Customer customer { get; set; }
public Business address { get; set; }
public List<InvoiceItems> items { get; set; }
}
(Beispiel Klassen)
Gibt es eine Begrenzung andere als 1MB Größe zu legen, die in die Tabelle? Ich habe gelesen, bis auf TableServiceEntity, sollte die anzeigen C# - Objekte, aber wird es behandeln?
In diesem Stadium ist das eine sehr hypothetische Frage, da ich noch nicht wirklich versucht, diese zu Programmieren. Jede Hilfe würde geschätzt werden.
InformationsquelleAutor metase | 2013-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Komplexe Eigenschaften, die nicht bekommen, werden in Tabelle Speicher. Nur eine Teilmenge der standard-Datentypen können gespeichert werden. Überprüfen Sie diesen link für mehr info auf welche Datentypen werden unterstützt: http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx (Suchen Sie unter Immobilien im Abschnitt "Inhaltstypen")
Jedoch, was Sie tun möchten, ist möglich, nur etwas schwieriger zu implementieren. Hier sind zwei Möglichkeiten, dies getan werden kann:
Aussetzen CustomerSerialized, AddressSerialized und ItemsSerialized Eigenschaften auf Ihre WholeObject Klasse. Diese Eigenschaften serialisieren/Deserialisieren Ihre damit verbundenen komplexe Objekte zu byte-array, json-oder xml-vielleicht. Zwei Nachteile bei diesem Ansatz: a) Sie werden immer geladen, vollständige Objekt-Baum, der aus dem azure-Tabellenspeicher, selbst wenn Sie nur brauchen, Customer-Objekt; b) Sie sind beschränkt auf 64 Kb pro Haus pro Objekt, so dass Sie besser sicherstellen, dass Ihre InvoiceItems Sammlung passen in 64kb serialisiert
Kommen mit einem PartitionKey/RowKey-schema, das erlauben würde, Sie zu speichern alle Arten von verwandten Objekten, die als einzelne Einheiten, sondern mit PartitionKey/Rowkey Angabe Ihrer Beziehung. Dieses würde Ihnen erlauben, bei der vollen Objekt-Baum oder an die einzelnen untergeordneten Objekte unabhängig voneinander. Dieser Ansatz hat nicht die zwei Nachteile des ersten Ansatzes, aber es ist definitiv auf der Komplex-Seite der Dinge bei der Umsetzung. Es schränkt auch Ihre Fähigkeit, tune PartitionKey/RowKey zu anderen business-Bedürfnisse. Ich habe dies getan, Ansatz für ein großes e-commerce-Unternehmen mit viel Erfolg.
In meinem Projekt, Die PartitionKey-für alle Unternehmen (Stamm-und untergeordneten) zugeordnet ist, um die ID der "WholeObject" während RowKey Bestand der verketteten Kombination von ParentObjectID, ChildObjectID und ChildObjectType. Wenn Sie benötigen, um alle Objekte in der WHoleObject, einfach eine Abfrage gegen PartitionKey, anderweitig zu nutzen PartitionKey und Teil der RowKey bei bestimmten Typen von Objekten (sprich: alle Adressen) oder PartitionKey und voller RowKey, um auf eine einzelne Einheit. Dieser Ansatz unterstützt unbegrenzt tief-Objekt-Struktur, aber sobald die Anzahl der Einheiten, die ging über 100, das speichern des Objekts in einer Transaktion war ein Kopfschmerz.
HTH
Ja. Alternativ, Sie können einfach verwenden Sie blob-Speicher zum speichern das ganze als eine einzige Datei
InformationsquelleAutor Igorek
Ich habe ein ähnliches problem und implementiert ein generisches Objekt flattener/recomposer API, reduzieren Ihre komplexen Entitäten in flache
EntityProperty
Wörterbücher und machen Sie schreibbar sind in Tabelle Speicher in form vonDynamicTableEntity
.Gleichen API wird dann wieder zusammensetzen das gesamte komplexe Objekt wieder aus der
EntityProperty
Wörterbuch derDynamicTableEntity
.Haben Sie einen Blick auf: https://www.nuget.org/packages/ObjectFlattenerRecomposer/
Verwendung:
Seit dann arbeitete ich mit azure-team und integriert diese Funktionalität zu Azure Storage-SDK version 8.0.
Ein wichtiger Hinweis, dass die api ' s in Azure SDK NICHT unterstützt
IEnumerable
oderICollection
Typ-Eigenschaften. Aber wenn man das nuget-Paket-v2, die in dem oben genannten link kann man ziemlich viel schreiben, jedes Objekt in Azure Table Storage, einschließlich Objekte mit enumerable, collection-Typ-Eigenschaften.https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableentity.flatten.aspx
https://msdn.microsoft.com/en-us/library/azure/mt775432.aspx
Habe ich auch noch
TableEntityAdapter
Klasse SDK version 8.2.0, um die Nutzung zu erleichtern. Übergeben Sie einfach Ihre komplexe Einheit an seinen Konstruktor übergeben und es wird transparent Griff-Abflachung/Konvertierung zurück in Ihre komplexen Objekt, schreibt und liest.https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Table/TableEntityAdapter.cs
Sie könnte einen enhancement request an azure-team, in der SDK s offizielle GitHub. github.com/Azure/azure-storage-net/issues, Wenn Sie entscheiden, um es auf zu nehmen, konnten wir integrieren neueste version mit SDK.
InformationsquelleAutor Dogu Arslan