Frage

Ich bin mit Firebird 2.1 und ich bin auf der Suche nach dem besten Weg, dieses Problem zu lösen.

Ich schreibe eine Kalenderanwendung. Verschiedene Benutzer Kalendereinträge werden in einer großen Kalender-Tabelle gespeichert. Jeder Kalendereintrag kann eine Erinnerung gesetzt haben -. Nur eine Erinnerung / entry

Statistisch gesehen, die Kalender-Tabelle auf Hunderttausende von Datensätzen im Laufe der Zeit wachsen könnte, während es werden viel weniger Erinnerungen sein.

Ich brauche die Erinnerungen auf einer konstanten Basis abgefragt werden.

Welche ist die beste Option?

A) Bewahren Sie das Info Erinnerungen im Kalender-Tabelle (in diesem Fall werde ich Abfrage Hunderttausende von Datensätzen für IsReminder = 1)

Erstellen

B) eine separate Reminders Tabelle, die nur die ID des Kalendereintrags enthält, die Erinnerungen festgelegt haben, dann fragen Sie die zwei Tabellen mit einer JOIN-Operation (oder vielleicht eine Ansicht erstellen auf sie)

C) kann ich speichern alle Informationen über Erinnerungen in der Reminders Tabelle, dann Abfrage nur diese Tabelle. Der Nachteil ist, dass einige Informationen in beiden Tabellen dupliziert werden muss, wie um die Erinnerung zu zeigen, wird ich wissen müssen, und speichern Sie die Startzeit des Ereignisses in der Tabelle Reminders - also zwei Tabellen mit den gleichen Werten wir beibehalten.

Was denken Sie?

Und noch eine Frage: Die Kalender-Tabelle wird den Kalender mehrerer Benutzer enthält, getrennt nur durch ein Benutzer-ID-Feld. Da es nur 4-5 Benutzer sein kann, auch wenn ich einen Index auf diesem Gebiet setzen, wird seine Selektivität geht sehr schlecht sein - was für einen Tisch mit Hunderttausenden von Datensätzen ist nicht gut. Gibt es eine Abhilfe hier?

Danke!

War es hilfreich?

Lösung

Es gibt Vorteile und Nachteile für alle drei Möglichkeiten. Whis ist am besten, hängt von Details, die Sie nicht zur Verfügung gestellt haben. In der Regel nicht allzu viele Sorgen über die Auswahl von drei oder vier Einträge aus hunderttausend, sofern die Indizes Sie eingerichtet haben die richtige Abrufstrategie ermöglichen. Wenn nicht Indizierung verstehen, sind Sie wahrscheinlich egal, in Schwierigkeiten sein, welche der drei Möglichkeiten Sie machen.

Wenn es nach mir ginge, würde ich mit Wahl B. gehe ich auch für Mahnungen alle Attribute einer Mahnung in der Tabelle gespeichert werden würde.

Seien Sie sehr vorsichtig, ob Sie ein Ereignis von EventId identifizieren allein oder durch (UserId, EventId). Wenn Sie sich für Letzteres entscheiden, obliegt es Ihnen, eine Verbindung Primärschlüssel für die Ereignistabelle zu verwenden. Sie nicht zu viel über Verbindung Primärschlüssel Sorge, vor allem mit Firebird.
Wenn Sie eine Verbindung Primärschlüssel deklarieren, beachten Sie, dass zu erklären (UserId, EventId) nicht die gleichen Folgen haben wie erklärt (EventId, Benutzer-ID). Sie sind logisch gleichwertig, aber die Struktur des automatisch generierten Index wird in den beiden Fällen unterschiedlich sein.

Dies wiederum wirkt sich auf die Geschwindigkeit von Abfragen wie „alle Erinnerungen für einen bestimmten Benutzer finden“.

Auch wenn es nach mir ginge, würde ich Wahl C. die Einschleppung von Schad Redundanz in ein Schema vermeiden trägt damit die Verantwortung für einige sehr sorgfältige Programmierung, wenn Sie die Daten aktualisieren gehen. Andernfalls können Sie mit einer Datenbank am Ende, dass speichern widersprüchliche Versionen derselben Tatsache an verschiedenen Orten der Datenbank.

Und wenn Sie wirklich die Wirkung auf perfromance wissen wollen, versuchen Sie, alle drei Möglichkeiten, Last mit Testdaten und Ihre eigenen Benchmarks tun.

Andere Tipps

Ich glaube, Sie realistisch erstellen müssen, gefälschte Benutzerdaten und messen die Differenz mit einigen typischen Fragen, die Sie laufen erwarten.

Indexierung, Abfrage-Optimierung und die Art der Abfrage-Ergebnisse benötigen Sie einen grossen Unterschied machen, so ist es nicht leicht zu sagen, was am besten ist, ohne mehr zu wissen.

Wenn Option wählen (A) Sie sollten

  • bietet einen Index für „IsReminder“ (oder einen kombinierten Index auf IsReminder, Benutzer-ID, was am besten zu Ihren beabsichtigten Abfragen paßt)
  • Überprüfen Sie Ihre Abfragen verwenden diesen Index

Option B ist über A vorzuziehen, wenn Sie mehr als ein boolean-Flag haben für jede Mahnung zu speichern (zum Beispiel die Anzahl der Minuten muss der Nutzer vor der Veranstaltung mitgeteilt werden). Sie sollten jedoch machen einige zu raten, wie oft in Ihrem Programm werden Sie beiden Tabellen verknüpft haben.

Wenn Sie können, vermeiden Option C. Wenn Sie nicht wollen, zu Benchmark alle drei Fälle, schlage ich mit A oder B beginnen, nach den beschriebenen Umständen und wahrscheinlich auch die Lösung, die Sie schnell genug wählen werden, so dass Sie müssen nicht mit den anderen Fällen stören.

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