Dieser Artikel wurde maschinell übersetzt.

Datenpunkte

Windows-Speicher – nicht Azure Tabelle Ihres Vaters Datenbank

Julie Lerman

Downloaden des Codebeispiels

Julie LermanWindows Azure Tabelle Speicher wird viel Head scratching zwischen den Entwicklern. Die meisten Ihrer Erfahrung mit der Speicherung von Daten sind mit relationalen Datenbanken, die verschiedenen Tabellen jede enthält einen vordefinierten Satz von Spalten, die eine oder mehrere der in der Regel als Identitätsschlüssel festgelegt sind. Tabellen verwenden diese Schlüssel zum Definieren von Beziehungen zwischen einem another. Windows Azure speichert Informationen verschiedene Möglichkeiten, aber zwei, das Beibehalten von strukturierten Daten darauf konzentrieren, SQL Azure und Windows Azure Tabelle belegt sind. Die erste ist eine relationale Datenbank und richtet sich relativ eng mit SQL Server. Tabellen mit definierten Schema, Schlüssel, Beziehungen und andere Einschränkungen hat, und Sie mit eine Verbindungszeichenfolge, wie mit SQL Server und andere Datenbanken verbinden.

Windows Azure Tabelle speichern, scheint andererseits, ein bisschen geheimnisvollen auf jene von uns, die also zum Arbeiten mit relationalen Datenbanken verwendet werden. Während Sie viele ausgezeichnete Exemplarische Vorgehensweisen finden für das Erstellen von Anwendungen, die Windows Azure Table-Speicher verwenden, finden viele Entwickler immer noch selbst gezwungen, stellen Leaps von glauben ohne wirklich zu verstehen, worum es geht.

In dieser Spalte wird die hängen in relationalen Modus-Brücke, die besonders von glauben mit Volltonfarbe Boden, indem einige Kernkonzepte von Windows Azure Tabelle Speicher aus der Perspektive des relationalen denken helfen. Darüber hinaus werde ich einige wichtigen Strategien für das Entwerfen von Tabellen, je nachdem, wie Sie erwarten zum Abfragen und Aktualisieren von Daten berühren.

Speichern von Daten für den Abruf von effizienten und Permanenz

Konstruktionsbedingt Windows Azure Table-Dienste zur Verfügung stellt des Potenzial, enorme Datenmengen speichern, beim Aktivieren der effizienten Zugriff und Dauerhaftigkeit. Die Dienste vereinfachen, Speicherung, die Sie aus springen über alle Hoops, die erforderlich sind, arbeiten mit einer relationalen Datenbank speichern, Einschränkungen, Ansichten, Indizes, Beziehungen und gespeicherte Prozeduren. Sie betreffen nur Daten, Daten und Daten. Windows Azure Tabellen verwenden, mit denen effiziente Abfrage, und Sie können eine einsetzen, die PartitionKey – für den Lastenausgleich bei der Dienst Tabelle entscheidet, ist es Zeit zu Ihrer Tabelle über mehrere Server verteilt. Eine Tabelle muss ein angegebenes Schema keinen. Es ist lediglich ein strukturierter Container von Zeilen (oder Entitäten), der wichtig sind nicht wie eine Zeile aussieht. Sie können eine Tabelle, die eine bestimmte gespeichert haben, aber Sie können auch Zeilen mit unterschiedlichen Strukturen in einer Tabelle speichern, wie in der Abbildung 1 .

image: A Single Windows Azure Table Can Contain Rows Representing Similar or Different Entities

Abbildung 1 A Single Windows kann Azure Tabelle enthalten Zeilen darstellen von ähnlichen oder anderen Entitäten

Es alles beginnt mit der Domänen-Klassen

Unsere Prozedur typische Entwicklung mit Datenbanken erstellen, definieren in diesen Tabellen und definieren dann für jede Tabelle eine bestimmte Struktur ist, bestimmte Spalten, jeweils mit einem angegebenen Datentyp – sowie die Beziehungen zu anderen Tabellen. Anschließend drücken Sie unsere Anwendungen Daten und Daten aus den Tabellen.

Mit Windows Azure Table-Diensten Entwerfen nicht jedoch beim einer Datenbank, nur die Klassen. Sie definieren Klassen und einen Container (Tabelle), eine oder mehrere Klassen angehören, dann können Sie instanziierten Objekte speichern zurück in den Speicher als Zeilen.

Zusätzlich zu den Eigenschaften, die in den Klassen Sie müssen, muss jede Klasse drei Eigenschaften verfügen, die bestimmen, wie Windows Azure Tabelle Dienste Ihre beruflichen Aufgaben als kritisch sind: PartitionKey RowKey und TimeStamp. PartitionKey und RowKey sind beide Zeichenfolgen und ist eine Kunst (oder vielleicht eine Wissenschaft) zum Definieren von so, dass Sie den besten Ausgleich der Abfrage und Transaktion Effizienz zusammen mit Skalierbarkeit zur Laufzeit abrufen. Eine gute Einführung zum Definieren von PartitionKeys und RowKeys für die meisten Vorteile, empfehle ich präsentiert von Jai Haridas, mit denen Sie überwachen können, microsoftpdc.com/sessions/svc09-PDC09 Sitzung “ Windows Azure Tabellen und Warteschlangen Deep Dive, ”.

PartitionKeys und RowKeys Drive, Leistung und Skalierbarkeit

Viele Entwickler werden verwendet, um ein System von Primärschlüsseln, Fremdschlüsseln und Einschränkungen zwischen den beiden. Mit Windows Azure Tabelle speichern müssen Sie diese Konzepte loslassen, oder haben Sie Schwierigkeiten, die das System von Schlüsseln zu beanspruchen.

In Windows Azure Tabellen die Zeichenfolge PartitionKey und RowKey Eigenschaften arbeiten zusammen als Index für die Tabelle und wenn Sie definieren möchten, die Sie berücksichtigen müssen werden wie Ihre Daten abgefragt. Zusammen stellen die Eigenschaften für die Eindeutigkeit, fungiert als Primärschlüssel für die Zeile. Jede Entität in einer Tabelle muss eine eindeutige Kombination von PartitionKey/RowKey sein.

Jedoch müssen Sie beim Definieren einer PartitionKey mehr als Abfragen, da Sie auch für die physisch Partitionierung der Tabellen, die für den Lastenausgleich und Skalierbarkeit bietet verwendet wird. Betrachten Sie beispielsweise eine Tabelle, die Informationen zum Essen enthält und PartitionKeys, die die Nahrungsmittel-Typen, z. B. Obst, Gemüse und Körnung entsprechen. Im Sommer können die Zeilen in der Partition TheVegetable sehr beschäftigt (eine so genannte “ hot ” Partition zunehmend) sein. Der Dienst kann Lastenausgleich die Food-Tabelle durch Verschieben der Gemüse-Partition auf einem anderen Server zu 
better behandeln viele Anforderungen an die Partition.

Wenn Sie weitere Aktivitäten auf dieser Partition als ein einzelner Server verarbeiten kann, sollten Sie sich z. B. Vegetable_Root und Vegetable_Squash mehr granulare Partitionen erstellen. Dies ist, da die Einheit der Granularität für den Lastenausgleich der PartitionKey ist. Alle Zeilen mit demselben Wert PartitionKey zusammen bleiben beim Lastenausgleich. Sie könnten sogar Ihrer Tabelle so entwerfen, dass jedes einzelne Entität in der Tabelle auf eine andere Partition hat.

Detaillierte Untersuchung tieferer PartitionKeys und Abfragen

Beachten Sie, als ich die Feinabstimmung der Gemüse PartitionKeys vorgeschlagen, ich Gemüse am Anfang des Schlüssels nicht am Ende eingefügt. Dies ist ein weiterer Mechanismus für die effizientere Abfragen. Abfragen Windows Azure von Tabellen aus dem Microsoft .NET Framework verwenden LINQ to REST und einen Kontext, der von der WCF-Data Services System.Data.Services.Client.DataServiceContext abgeleitet wird. Wenn Sie grünen Squash suchen möchten, können Sie in der Partition Vegetable_Squash durchsuchen, ohne unnötig Ressourcen, um die gesamte Tabelle durchsuchen:

var query = _serviceContext.FoodTable.AsTableServiceQuery()
.Where(c => c.PartitionKey=="Vegetable_Squash"&& c.Color == "Green");

Ein großer Unterschied zwischen Abfragen OData (zurückgegeben durch WCF Data Services) und Windows Azure Tabellen Abfragen ist, dass String-Funktionen nicht unterstützt werden. Wenn Sie Teil einer Zeichenfolge suchen möchten, müssen Sie die String.CompareTo verwenden, um die ersten Zeichen der Zeichenfolge zu überprüfen. Wenn Sie die gesamte Kategorie von Gemüse abfragen möchten, jedoch können die CompareTo-Methode Sie eine Präfixsuche über den Anfang der PartitionKey durchzuführen:

var query = _serviceContext.FoodTable.AsTableServiceQuery()
            .Where(c => c.PartitionKey.CompareTo("Vegetable")>=0
            && c.PartitionKey.CompareTo("Vegetablf")<0
            && c.Color == "Green");

Dadurch schränken die Suche nur Partitionen, die mit Gemüse beginnen – nichts weniger und nicht mehr. (Mithilfe von Vegetablf anstelle von Gemüse in das zweite Prädikat definiert die obere Grenze, die verhindert, dass Lebensmittel in Partitionen wie Joghurt oder VegetableLike zurückgegeben wird.) Im Codebeispiel zu diesem Artikel sehen Sie, wie ich diese Ersetzung dynamisch durchgeführt haben.

Scans parallele Abfragen für alle Tabellen

Was geschieht, wenn alle grünen Essen, unabhängig vom Typ des gesuchten wurden? Windows Azure müsste über die gesamte Tabelle zu durchsuchen. Wenn es sich um eine große Tabelle ist, löst Azure Windows in einem anderen Schraubenschlüsselsymbol: Es kann nur 1000 Zeilen (oder Prozess für 5 Sekunden) zurück. Windows Azure diese Ergebnisse zusammen mit einer Fortsetzung Schlüssel zurückgeben und dann für mehr zurück. Dies kann eine synchrone mühsamer Prozess sein.

Stattdessen konnte eine Reihe von Abfragen ausgeführt werden, z. B. eine Liste bekannter Kategorien durchlaufen und dann jede Abfrage erstellen:

_serviceContext.FoodTable.AsTableServiceQuery()
.Where(c => c.PartitionKey == _category && c.Color == "Green");

Dann senden Sie deaktiviert alle Abfragen parallel ausgeführt werden.

Weitere Überlegungen zum Entwurf für Abfragen

Die RowKey-Eigenschaft dient eine Reihe von Zwecken. In Kombination mit PartitionKey kann er die Eindeutigkeit innerhalb einer Tabelle für jede Zeile definieren. Angenommen, ich weiß, dass ein anderes Julie Lerman (tatsächlich ich tun). Damit werden die RowKey wichtige Unterscheidung uns, wenn wir eine PartitionKey von Lerman_julie freigeben. Auch können RowKey bei der Sortierung, weil Sie als Teil eines Indexes fungiert. Was würde also dann nützlich RowKeys Julie Lerman Elder an (die mir ist) und Angelika Lerman die jünger sein? Eine GUID wird sicherlich den Stich für Identität ausführen, jedoch führt keine Aktion für die Suche oder sortieren. In diesem Fall wäre eine Kombination von Werten wahrscheinlich am besten.

Was unterscheidet uns? Wir auf gegenüberliegenden Seiten der Vereinigten Staaten leben, aber Speicherorte ändern können, die nicht für einen Schlüssel sinnvoll ist. Sicherlich unsere Geburtsdatum unterscheidet (durch mehr als 20 Jahre) und einen statischen Wert. Jedoch immer die Möglichkeit, die anderen Julie Lerman mit Mein Geburtsdatum existiert in der Welt und in meiner Datenbank Angeln konnte – hoch implausible jedoch nicht unmöglich. Nachdem alle von den Deliberation durchlaufen kann, Geburtsdatum weiterhin einen Wert möglicherweise nicht auf dem meiner Anwendung sortieren suchen oder ist. Damit in diesem Fall RowKey möglicherweise nicht Teil der Abfragen und eine GUID Plain Old ausreichen würde. Sie haben diese Arten von Entscheidungen für alle Ihre Windows Azure Tabellen vornehmen.

Es gibt viel mehr Informationen zum Definieren von Schlüsseln und Faktoren, z. B. das Abrufen von Daten, das Speichern von Daten, Skalierbarkeit und Lastenausgleich alle kommen ins Spiel.

Rethinking Beziehungen

In einer relationalen Datenbank benötigen wir Fremdschlüssel und Einschränkungen, Beziehungen zu definieren. Wir könnten sicherlich eine Fremdschlüsseleigenschaft in einer Klasse, die auf einer anderen Klasse definieren, aber es gibt nichts im Speicher von Windows Azure Tabellen, Beziehungen zu erzwingen. Der Code wird weiterhin für, die verantwortlich sein.

Dies wirkt sich auf, wie Sie Abfragen und Aktualisierungen (einschließlich Einfügungen und Löschungen) aus Tabellen durchführen.

Bei der Abfrage können Sie keine Verknüpfungen zwischen Tabellen durchführen. Und beim Beibehalten von Daten Sie können keine haben durchgeführt Befehle, die Partitionen oder Tabellen umfassen. Es gibt jedoch einen Mechanismus für die Arbeit mit Daten in Diagrammen, die ich am Anfang dieses Artikels hingewiesen wird, können Zeilen mit unterschiedlichen Schemas in einer einzigen Tabelle gespeichert.

Wenn die Anwendung erfordert, dass Benutzer mit Kontakte und Adressen zusammen arbeiten, können Sie die Adressen in derselben Tabelle wie die Kontakte speichern. Es wäre, um sicherzustellen, dass die Adressen des gleichen PartitionKey kritische – z. B. “ Lerman_julie ”. Darüber hinaus sollte die RowKey einen Wert enthalten, der angibt, den Typ oder die Art der Entität, z. B. “ address_12345 ”, sodass Sie problemlos zwischen Kontaktarten und Adresstypen unterscheiden können, wenn Sie Abfragen.

Allgemeine PartitionKey wird sichergestellt, dass die Zeilen immer zusammenbleiben werden ein Feature namens „ Entity von Transaktionen (EGT) nutzen. Dadurch wird eine Transaktion atomar über mehrere Entitäten Ausführen von Vorgängen, solange die Entitäten PartitionKey denselben Wert haben. Einer der Vorteile von EGT in Bezug auf verwandte Daten ist, dass eine durchgeführte Aktualisierung für alle Entitäten in einer einzigen Transaktion durchgeführt werden können.

Ein Base-Datenbank mit Informationen zum Verständnis von der erfahren mehr

Windows Azure Tabellen befinden sich in der Wolke, aber für mich, die Sie in einem Nebel begann. Ich habe viele Probleme beim Abrufen von meinem Kopf aufgrund von meinem preconceived Verständnis der relationalen Datenbanken herum umbrochen. Ich war viel Arbeit (und eine Menge Leute pestered) aktivieren, mich auf der Anchor RDBMS loslassen, konnte ich übernehmen und der Vorteil des Windows Azure Tabellen wirklich zu schätzen wissen. Ich hoffe, dass meine Reise weitergegebenen kürzere vorgenommen werden.

Es gibt noch viele weitere Informationen zu den Diensten von Windows Azure Tabelle. Das Team bei Microsoft hat einige hervorragende Anleitung auf MSDN. Überprüfen Sie zusätzlich zu dem oben genannten PDC09 Video dieser Ressourcenseite auf Windows Azure Speicher-Teamblog unter blogs.msdn.com/windowsazurestorage/archive/2010/03/28/windows-azure-storage-resources-. Weiterhin das Team detaillierte, informative Beiträge im Blog hinzufügen und ich weiß, rechtzeitig, oder sogar nach der Veröffentlichung dieses Artikels ist, werde ich Antworten auf meine Fragen unzähligen finden. Ich freue mich zu bieten einige konkrete Beispiele in einer zukünftigen Kolumne der Datenpunkte.

Julie Lerman* ist als Microsoft MVP, .NET-Mentor und Unternehmensberaterin tätig und wohnt in den Bergen von Vermont. Sie hält bei User Groups und Konferenzen in der ganzen Welt Vorträge zum Thema Datenzugriff und anderen Microsoft .NET-Themen. Lerman führt einen Blogs unter thedatafarm.com/blog und ist Autorin des hoch gelobten Titels "Programming Entity Framework" (O’Reilly Media, 2009). Führen Sie ihn auf die Twitter.com: julielerman.*

Dank an die folgenden technischen Experten für die Überprüfung der in diesem Artikel: Brad CalderandJai Haridas