2009-07-16 2 views
2

Ich versuche, eine Datenbank für die Inventursteuerung mit einer großen Anzahl von Tabellen und erzwungenen Beziehungen zu erstellen, und ich lief gerade in der 32-Beziehung (Index) Grenze für eine Access-Tabelle (mit Access 2007).Umgehen der Grenze von 32 Beziehungen pro Tabelle in Access

Nur um zu verdeutlichen: Das Problem besteht nicht darin, dass die Employees-Tabelle 32 explizite Indizes hat. Das Problem liegt eher in der Beschränkung der Anzahl der Zeiten, in denen die Employee-Tabelle in FOREIGN KEY Constraints referenziert werden kann. Zum Beispiel:

CREATE TABLE Employees (employee_number INTEGER NOT NULL UNIQUE) 
; 
CREATE TABLE Table01 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number)) 
; 
CREATE TABLE Table02 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number)) 
; 
CREATE TABLE Table03 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number)) 
; 

... 

CREATE TABLE Table30 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number)) 
; 
CREATE TABLE Table31 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number)) 
; 
CREATE TABLE Table32 (employee_number INTEGER NOT NULL REFERENCES Employees (employee_number)) 
; 

Eine Ausnahme in der letzten Zeile oben geworfen wird, „Index konnte nicht erstellt werden, zu viele Indizes definiert

Welche Möglichkeiten habe ich, um diese Einschränkung arbeiten

.? Ich habe gehört, dass das Erstellen einer doppelten Tabelle mit einer 1: 1-Beziehung eine Methode ist.Ich bin neu im Datenbankdesign, also bitte korrigieren Sie mich, wenn ich falsch liege, aber bei einer Tabelle Mitarbeiter mit 31 Indizes würde ich eine erstellen Tabelle Employees2 (mit einem Feld?) mit einer 1: 1-Beziehung zu Employees und Beziehungen zu dieser neuen Tabelle aus allen verbleibenden Beziehungen, in denen die EmployeeID ein Forei ist gn Schlüssel. Was ist der beste Weg, um sicherzustellen, dass die zweite Tabelle neben der ersten belegt ist?

Gibt es einen anderen Ansatz?

Aufgrund des Mangels an verfügbaren Informationen scheint dies ein seltenes Problem mit einer richtig gestalteten Datenbank zu sein, oder die Lösung ist allgemein bekannt. Verzeih den Noob!

Update: Sofortiger Konsens ist, dass mein Design borked oder viel zu ehrgeizig ist. Dies könnte sehr wohl der Fall sein. Allerdings würde ich lieber eine allgemeine Design-Diskussion in einer separaten Frage haben, um diese Frage zu beantworten, kann jemand diese Frage beantworten? Wenn die Antwort einfach lautet: "Tu das niemals", muss ich es akzeptieren.

+2

Ich denke, Sie werden feststellen, dass Ihr Gesamtdesign fehlerhaft ist. Dieses spezielle Limit wird sonst nicht erfüllt. – Smandoli

+0

"Gesamtdesign ist fehlerhaft" ist falsch. Ich hatte eine Reihe von Systemen, die dieses Problem hatten. –

+0

@Tony: Ah! Danke für diese Einsicht. Ich muss jedoch darauf hinweisen, dass unser Fragesteller sagt, er sei "neu im Datenbankdesign" .... – Smandoli

Antwort

-2

... würde ich eine Tabelle Employees2 (? Mit einem Feld) mit einer 1 erstellen: 1 Beziehung zu Mitarbeitern und Beziehungen zu dieser neuen Tabelle aus alle verbleibenden Beziehungen, in denen EmployeeID ein fremd ist Schlüssel.

Das ist praktikabel. Vermutlich hat Ihre Haupttabelle möglicherweise ein Feld "Autonumber" als Primärschlüssel oder Sie generieren eine Indexnummer. Ihre Employees2-Tabelle muss das natürlich widerspiegeln.

Was ist der beste Weg, die zweite Tabelle bevölkerte neben die ersten zu gewährleisten?

Das hängt etwas davon ab, wie Sie Datensätze hinzufügen. Aber im Allgemeinen müssen Sie natürlich die Regeln für Integrität einhalten. Dies hängt normalerweise damit zusammen, dass Sie die Tabellen in der richtigen Reihenfolge anhängen und sicherstellen, dass jeder Datensatz gespeichert wird, bevor Sie versuchen, einen zugehörigen Datensatz an anderer Stelle hinzuzufügen.

+0

Großartig, mein Hauptanliegen war, dass mein Ansatz für dieses Problem gültig war (fehlgeleitet oder nicht). Ich sollte in der Lage sein, ein Formular einzurichten, um neue Datensätze zu Mitarbeitern hinzuzufügen, und eine Kopie ihrer entsprechenden ID in der zweiten Tabelle. – freestyletin

+0

Gut. Ich vertraue darauf, dass es gut gehen wird. Wenn Sie auf dem grundlegenden Tabellenschema ("Wie möchten Sie ...") posten und die Details ausarbeiten, würde ich sehr daran interessiert sein, was Sie bekommen. – Smandoli

1

Es ist schwer für mich zu glauben, dass eine Employee-Tabelle 32 Indizes benötigen würde; Wenn dies tatsächlich der Fall ist, sollten Sie eine Migration auf mindestens SQL Express in Betracht ziehen.

+0

oder irgendetwas anderes, das nicht ist Zugriff – rmeador

+0

Ich stimme mit ocdecio überein, eine Mitarbeiter-Tabelle zu haben, die 32 Beziehungen erfordert, scheint seltsam, aber wir kennen Ihre Anforderungen nicht.+1 für die Migration zu SQLServer, ich glaube, Sie können ein Access-Front-End mit dem SqlServer-Backend verknüpfen (aber nie versucht haben) –

+0

Vereinbart - Access ist nicht gerade meine erste Wahl. Aber angenommen, ich stecke jetzt fest damit? Ich würde gerne die Möglichkeiten, die ich in diesem System habe, verstehen, damit ich eine fundierte Entscheidung für die Migration treffen kann. – freestyletin

3

Ich habe diese Einschränkung mehrmals mit meinen Apps erlebt. Und ich kann den anderen Plakaten versichern, dass meine Apps sehr gut gestaltet sind.

Ein Problem besteht darin, dass Access Indizes aufgrund von Beziehungen und Suchfeldern erstellt, die nicht in der Hauptindexeigenschaftsbox angezeigt werden können, aber über DAO-Auflistungen zugänglich sind. Diese Indizes sind häufig doppelte Indizes für Indizes, die Sie ebenfalls erstellt haben.

Ich habe ein Tool, das aus mehreren Formularen besteht, die Sie in Ihre BE-MDB importieren, mit der Sie die doppelten Indizes entfernen können. Da ich dies noch nicht auf meiner Website zur Verfügung gestellt habe, mailt mir bitte dafür.

+0

Haben Sie das Problem wegen der versteckten und automatisch erstellten Indizes aufgetreten? Haben Sie jemals nur die Indizes gefunden, die Sie hinzufügen wollten? –

+0

David, ich bin mir nicht sicher, ob ich deine Frage verstehe. Immer wenn ich auf dieses Problem gestoßen bin, wurden beide Indizes von Access erstellt und hinter den Kulissen und Indizes erstellt. Also entfernte ich die Indizes, die ich erstellt hatte, die mich um das Problem herumführten. Obwohl in einer bestimmten App das nicht genug war. –

+0

Ein Vorteil der Verwendung von SQL DLL im ANSI-92-Abfragemodus besteht darin, dass Sie die Schlüsselwörter NO INDEX in einer FOREIGN KEY-Deklaration verwenden können, um die Erstellung des impliziten Index zu verhindern. Nun, das hat Sie alle in SQL-DDL-Fanatiker verwandelt, richtig? ;) – onedaywhen

2

Ich würde vorschlagen, nicht alle Beziehungen/Indizes zu definieren, um eine 1: 1-Beziehung zu implementieren, um es zu umgehen. Keine der Lösungen ist optimal, aber die letztere wird eine viel höhere Wartungs- und Datenanomalie verursachen.

Ich werde das Design nicht so schnell wie einige der anderen, aber es hat mich intrigiert. Können Sie die Felder der Mitarbeitertabelle auflisten, die Fremdschlüssel sind? Es gibt eine gute Chance, dass eine gewisse Normalisierung in Ordnung ist, und vielleicht könnten einige der klugen Köpfe von SO einige Designvorschläge machen, um das Problem zu lösen.

+0

Ich habe das gleiche Interesse an dem Schema. Ich denke immer noch, dass ein neuer Posten angebracht wäre – Smandoli