Frage

Ich arbeite an einem MUD (Multi User Dungeon) in Python und bin gerade auf den Punkt um, wo ich brauche ein paar Zimmer, Feinde, Artikel hinzufügen, usw. Ich kann das alles in, hart codieren, aber es scheint wie das ist eher ein Job für eine Datenbank.

Allerdings habe ich wirklich noch nie eine Arbeit mit Datenbanken getan, damit ich mich gefragt, ob Sie einen Rat haben, wie diese bis setzen?

  • Was Format soll ich speichern die Daten in?
    • Ich dachte an für jede Entität ein Dictionary-Objekt in der Datenbank zu speichern. In htis Weise kann ich dann fügen Sie einfach neue Attribute in die Datenbank im laufenden Betrieb, ohne die Spalten der Datenbank zu ändern. Klingt das vernünftig?
  • lagere ich alle Informationen in der gleichen Datenbank, sondern in verschiedenen Tabellen oder verschiedene Einheiten (Feinden und Zimmer) in verschiedenen Datenbanken.

  • Ich weiß, dass dies eine Dose Würmer sein, aber was sind einige Vorschläge für eine gute Datenbank? Ist MySQL eine gute Wahl?

War es hilfreich?

Lösung

1) Es gibt so gut wie nie einen Grund, in verschiedenen Datenbanken Daten für die gleiche Anwendung zu haben. Nicht, wenn Sie eine Fortune500 Größe Unternehmen sind (OK, ich bin exaggregating).

2) Bewahren Sie die Informationen in verschiedenen Tabellen.

Als Beispiel:

  • T1: Zimmer

  • T2: Zimmer gemeinsame Eigenschaften (aplicable in jeden Raum), mit einer Zeile pro ** Zimmer *

  • T3: Zimmer einzigartige Eigenschaften (für Minderheit des Zimmers, mit einer Reihe pro Objekt pro Zimmer - thos macht es einfach, benutzerdefinierte Eigenschaften hinzufügen, ohne das Hinzufügen neue Spalten

  • T4: Room-Zimmer Verbindungen

    Mit T2 und T3 ist wichtig, da es Ihnen Effizienz und Geschwindigkeit der kombinieren Reihe pro Zimmer Idee, wo es mit Flexibilität / maintanability / Raum anwendbar ist Speichern von Attribut-pro-Einheit-pro-Zeile (oder Objekt / Attribut / Wert als IIRC es in der Phantasie Begriffe genannt) Schema

gute Diskussion ist hier

3) Die Umsetzung klug, versuchen, etwas schreiben wiederverwendbare, z.B. haben generische "Get_room" Methoden, die unter Zugriff auf die DB -. = idealerweise über Transact-SQL oder ANSI SQL, so dass Sie überleben können ziemlich schmerzlos von DB Back-End-Wechsel

Für die erste Arbeit, können Sie SQLite verwenden. Günstig, einfach und SQL kompatibel (die beste Eigenschaft von allen). Installation ist ziemlich nichts, kann DB-Management von Freeware-Tools oder auch FireFox Plugin IIRC erfolgen (alle FireFox 3 Datenspeicher - Geschichte, Lesezeichen, Orte, etc ... - sind alle SQLite-Datenbanken).

Für später entweder MySQL oder Postgres (Ich auch nicht ein professionell kann so nicht ein empfehlen). IIRC irgendwann Sybase hatte auch kostenlosen persönlichen DB-Server, aber keine Ahnung, ob das ist immer noch der Fall ist.

Andere Tipps

  • Diese Technik nennt Entity-Attribut-Wert-Modell . Es ist normalerweise haben DB-Schema bevorzugt, dass die Struktur der Objekte reflektiert, und aktualisieren Sie das Schema, wenn die Objektstruktur ändert. Solches strenges Schema ist einfacher zu Abfrage und es ist einfacher, um sicherzustellen, dass die Daten auf der Datenbankebene korrekt sind.
  • Eine Datenbank mit mehreren Tabellen ist die Art und Weise zu tun.
  • Wenn Sie einen Datenbankserver wollen, habe ich PostgreSQL empfehlen. MySQL hat einige Vorteile, wie einfache Replikation, aber PostgreSQL ist in der Regel schöner zu arbeiten. Wenn Sie etwas kleiner möchten, die direkt mit der Anwendung arbeitet, SQLite ist eine gute eingebettete Datenbank.

ein ganzes Objekt speichern (serialisiert / codiert) als Wert in der Datenbank ist schlecht für die Abfrage - ich bin sicher, dass einige Abfragen in Ihrem Schlamm werden nicht zu 100% von Attributen müssen wissen, oder können eine Liste von Objekt abrufen, indem Sie ein Wert von Attributen.

  

scheint es, wie dies eher ein Job   für eine Datenbank

True, obwohl ‚Datenbank‘ muss ‚relationale Datenbank‘ nicht bedeuten. Die meisten existierenden MUDs speichern alle Daten im Speicher, und es in von Flat-File in einem Klartext-Datenformat gespeichert lesen. Ich bin nicht unbedingt diesen Weg empfehlen, nur darauf hinweisen, dass eine traditionelle Datenbank keineswegs notwendig ist. Wenn Sie kommen, um den relationalen Weg, neuere Versionen von Python gehen wollen mit SQLite dem ist ein leichte relationale Datenbank mit guter SQL-Unterstützung eingebettet ist.

Verwenden von relationalen Datenbanken mit Ihrem Code kann umständlich sein. Jede Änderung an einem Spiel Logik-Klasse kann eine parallele Änderung in die Datenbank benötigen, und Änderungen an den Code, der in die Datenbank lesen und schreiben. Aus diesem Grunde wird ein gute Planung helfen, eine Menge, aber es ist schwer, ein gutes Datenbank-Schema ohne Erfahrung zu planen. Mindestens bekommen Entitätsklassen ersten geplant, dann um ihn herum ein Datenbankschema zu erstellen. Lesen auf Normalisierungs eine Datenbank und das Verständnis der Prinzipien wird es helfen.

können Sie wollen eine ‚objektrelationalen Mapper‘ verwenden, die eine Menge von dieser für Sie vereinfachen. Beispiele in Python umfassen SQLObject , SQLAlchemy und Autumn . Diese verstecken viele der Komplexitäten für Sie, aber als Ergebnis können einige der wichtigen Details verstecken zu. Ich würde empfehlen, die Datenbank mit direkt bis Sie mit ihm vertraut sind, und betrachte ein ORM in Zukunft verwendet wird.

  

Ich dachte an ein Wörterbuch zu speichern   Objekt in der Datenbank für jeden   Entität. In htis Weise konnte ich dann   fügen Sie einfach neue Attribute der   Datenbank on the fly ohne Änderung   die Spalten der Datenbank. Tut das   klingt vernünftig?

Leider nicht - wenn Sie das tun, verschwenden Sie 99% der Fähigkeiten der Datenbank und nutzen es effektiv als verherrlicht Datenspeicher. wenn Sie nicht vorher erwähnten Datenbank jedoch Fähigkeiten benötigen, ist dies eine gültige Route, wenn Sie das richtige Werkzeug für den Job verwenden. Der Standard shelve Modul ist auch ein Blick wert für diesen Zweck.

  

lagere ich alle Informationen in   die gleiche Datenbank, aber in unterschiedlichen   Tabellen oder verschiedene Einheiten (Feinde   und Zimmer) in verschiedenen Datenbanken.

Eine Datenbank. Eine Tabelle in der Datenbank pro Entitätstyp. Das ist die typische Vorgehensweise, wenn eine relationale Datenbank (zB. MySQL, SQL Server, SQLite, etc).

  

Ich weiß, das eine Dose Würmer sein,   aber was sind einige Vorschläge für eine   gute Datenbank? Ist MySQL eine gute Wahl?

würde ich mit SQLite kleben beraten, bis Sie besser vertraut mit SQL sind. Ansonsten MySQL ist eine vernünftige Wahl für ein freies Spiel Datenbank, wie PostGreSQL ist.

Eine Datenbank. Jede Datenbanktabelle zu einem tatsächlichen Datenobjekt beziehen.

Zum Beispiel erstellen Sie eine Tabelle für alle Artikel, alle Kreaturen, alle Charakterklassen, alle Schätze, etc.

Verbringen Sie einige Zeit jetzt und herauszufinden, wie Objekte miteinander in Beziehung stehen werden, da dies die Datenbankstruktur auswirken. Zum Beispiel kann mehr als eine Zeichenklasse ein Charakter hat? Können Monster Charakterklassen haben? Kann Monster tragen Artikel? Kann Zimmer mehr als ein Monster hat?

Es pedantisch scheint, aber Sie werden sich eine ganze Menge Ärger ersparen früh herauszufinden, was Datenbank „gehören“, auf die andere Datenbankobjekte Objekte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top