2009-07-22 13 views
2

Ich modelliere eine Datenbankbeziehung in Django, und ich möchte andere Meinungen haben. Die Beziehung ist eine Art Zwei-zu-Viele-Beziehung. Zum Beispiel kann ein Patient zwei Ärzte haben: eine Teilnahme und eine primäre. Ein Arzt hat offensichtlich viele Patienten.Wie würden Sie diese Datenbankbeziehung modellieren?

Die Anwendung muss wissen, welcher ist welcher; Darüber hinaus gibt es Fälle, in denen ein behandelnder Arzt eines Patienten der primäre eines anderen Patienten sein kann. Schließlich sind sowohl die Teilnahme als auch die Grundschulbildung oft dieselben.

Zuerst dachte ich zwei Fremdschlüssel vom Patiententisch in den Arzttisch. Ich denke jedoch, dass Django dies nicht zulässt. Darüber hinaus ist dies eine zweite (2) -zu-viele-Beziehung.

Also, wie kann ich diese Beziehung mit Django modellieren, während der Arzt-Typ, wie es sich auf einen Patienten bezieht, beibehalten wird? Vielleicht muss ich den Arzt-Typ auf der Viele-zu-Viele-Assoziationstabelle speichern?

Danke, Pete

Antwort

10

Wie wäre es etwa so:

class Patient(models.Model): 
    primary_physician = models.ForeignKey('Physician', related_name='primary_patients') 
    attending_physicial = models.ForeignKey('Physician', related_name='attending_patients') 

Dies ermöglicht es Ihnen, zwei Fremdschlüssel zu dem gleichen Modell zu haben; Das Physician Modell wird auch die Felder primary_patients und attending_patients haben.

+0

Hmm, das ist interessant. Ich bin froh, dass ich gefragt habe. Django hat vorgeschlagen, related_name irrtümlicherweise zu verwenden. – slypete

+1

Ja - weil in Abwesenheit von "related_name" der Arzt eine umgekehrte Beziehung "patient_set" erhalten würde. Dies führt jedoch zu einem Fehler, da beide Felder versuchen würden, eine umgekehrte Relation "patient_set" zu erstellen. Wenn Sie einen Fremdschlüssel für dasselbe Modell haben, müssen Sie "related_name" angeben, um dieses Problem zu vermeiden. – mipadi

+0

Dies führt zu Duplikaten beim Abrufen der Patientenliste eines Arztes. Die Anwendung muss die Union übernehmen. – slypete

0

Ich stimme mit Ihrem Abschluss. Ich würde den Arzttyp in der Viele-zu-Viele-Verknüpfungstabelle speichern.

1

Verwenden Sie eine Viele-zu-Viele-Join-Tabelle. Verwenden Sie Anwendungslogik, um mehr als zwei Ärzte pro Patient zu verhindern.

Physician 
    Physician_ID 
    ... 

Patient 
    Patient_ID 
    ... 

Physician_Patient 
    Physician_ID int not null 
    Patient_ID int not null 
    Type ENUM ('Primary', 'Attending') 
    PRIMARY KEY (Physician_ID, Patient_ID) 
    KEY (Patient_ID) 
+0

Möglicherweise können Sie sogar eine Einschränkung auf Datenbankebene einfügen. Abhängig von Ihrem DBMS. –

+0

Djangos ORM-Layer verfügt nicht über ein Modell, das eine Join-Tabelle darstellt. Join-Tabellen werden automatisch erstellt, und zusätzliche Spalten können nicht hinzugefügt werden. Sie können ein Modell mit ForeignKey-Feldern erstellen, die eine Join-Tabelle konzeptuell darstellen können, und zusätzliche Felder hinzufügen, die jedoch angesichts anderer Lösungen ein wenig unhandlich sind. – mipadi

+0

Sicher tut es. http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships Ich sehe keinen Grund, hier eine M2M-Beziehung zu verwenden. Ein normaler Fremdschlüssel ist in Ordnung. –

Verwandte Themen