2009-04-12 12 views
0

Ich habe vor kurzem die Arbeit an einem Projekt begonnen, das die Erstellung einer Web-basierten Reporting-Schnittstelle für eine ziemlich alte Software für die Verwaltung einiger Access Control Hardware wie elektronische Türschlösser zum Beispiel enthält.
Ich habe CakePHP für die Aufgabe ausgewählt und alles, was es beinhaltet, ist die Abfrage der Datenbank nach den Protokolldatensätzen und deren Anzeige auf der Website. Die Software ist in C++ geschrieben und benutzt MSDE (eine verkleinerte Version von Microsoft SQL Server 7.0 oder 2000) und ich konnte CakePHP so konfigurieren, dass es sich erfolgreich mit der DB verbindet.Abfrage von Daten aus mehreren gruppierten Tabellen als eine einheitliche

Das Problem ist, dass der Entwickler dieser Software ausgewählt hat, die Protokolle in der Datenbank zu speichern, indem eine separate Tabelle für jeden Tag erstellt. So sieht es wie folgt aus:

tbl_DoorEvent_2008_08_07 
tbl_DoorEvent_2008_08_08 
tbl_DoorEvent_2008_08_09 
tbl_DoorEvent_2008_08_10 
... 

Ich bin nicht wirklich vertraut mit MSDE, aber ich bezweifle, dass es immer noch eine akzeptable Praxis ist eine Datenbank, wie diese zu gestalten und zu pflegen. Ich weiß nicht, wie die Desktop-Software es schafft, alle Informationen abzufragen, wenn alles in diesem Format ist, aber meine CakePHP-Anwendung hat es wirklich schwer, das zu kauen.

Ich möchte mit MVC für die Webanwendung bleiben, aber ich weiß nicht, wie Sie das DooreventModel in CakePHP implementieren, damit es die Informationen aus allen partitionierten Tabellen erhält.
Ich habe versucht, einige Hacks Umsetzung wie

UNION ALL SELECT * FROM tbl_DoorEvent_2008_08_07 
UNION ALL SELECT * FROM tbl_DoorEvent_2008_08_08 
.... 

und diese Art von Arbeiten verwenden, aber wenn ich WHERE Beschränkung auf der gesamten Abfrage oder einen anderen SQL-Operator ausführen möge es nicht funktioniert. Eine der Anforderungen war, dass die webbasierte Anwendung keine zusätzlichen Datenbanken oder Tabellen hinzufügt oder erstellt und nur die vorhandenen verwendet, um die Berichte anzuzeigen, sodass das Erstellen einer großen Tabelle, die alle gruppierten Tabellen enthält, nicht erfolgt wirklich eine Option.

Ich hoffe nur, dass jemand mit einer SQLServer-Funktion kommen wird, die alle Tabellen in mir für jedes Mal zusammenführen wird, wenn ich eine Abfrage durchführe, aber ich weiß, dass dies ein bisschen optimistisch ist, also bin ich offen für alle Vorschläge. Und bitte denken Sie daran, dass die Lösung mit CakePHP und als ein einziges Modell in der MVC

+0

plzsendzmetehcode? –

+0

Mitch, welchen Code? – duckyflip

Antwort

1

Sie wollen wahrscheinlich ein partitioned view arbeiten müssen?

+0

Partitionierte Ansichten auf MSDE? – gbn

+0

Ja. In diesem Fall ist es nur ein eindeutiger Name für eine einfache UNION ALL-Ansicht, die aufgrund des seltsamen Tabellenschemas eine partitionierte Ansicht ist. Es hat nichts mit 'echten' partitionierten Tabellen zu tun und sie auf erweiterte Weise zu verwalten. Sehen Sie, die obige Antwort ist trotz der gleichen Aussage wie meine. – GSerg

3

können Sie eine where-Anweisung verwenden, wenn Sie die Gewerkschaften in einer Unterabfrage setzen:

SELECT * 
FROM (
    SELECT * FROM tbl_DoorEvent_2008_08_07 
    UNION ALL 
    SELECT * FROM tbl_DoorEvent_2008_08_08 
) sub 
where sub.MyKey = MyValue 

Oder eine Ansicht erstellen:

CREATE VIEW vw_MyView 
AS 
SELECT * FROM tbl_DoorEvent_2008_08_07 
UNION ALL 
SELECT * FROM tbl_DoorEvent_2008_08_08 

Danach können Sie die Ansicht abfragen können:

SELECT * from vw_MyView where MyKey = MyValue 

PS Verwenden Sie niemals * in Produktionsabfragen, insbesondere keine Ansichten.

Verwandte Themen