Python und Postgres Codes aufschlüsseln

  • Ersteller Ersteller derPaddie
  • Erstellt am Erstellt am
D

derPaddie

Gast
Hi,

wußte irgendwie kein besseres Topic ;-). Also ich möchte die verschiedenen IP-Codes (Schutz gegen Fremdkörper, Wasser ...) in meiner DB abbilden und dann in einem kleinen Python-Programm nutzen

Mein erster Einfall sind 3 Klassen:

Python:
class IPCodes(db.Model):
    __tablename__ = 'ip_codes'
    id = db.Column(db.Integer, primary_key=True)
    first_digit_id = db.Column(db.Integer, ForeignKey('ip_first_digit.id'))
    first_digit = db.relationship("IPFirstDigit", back_populates='ipcodes')
    second_digit_id = db.Column(db.Integer, ForeignKey('ip_second_digit.id'))
    second_digit = db.relationship("IPSecondDigit", back_populates='ipcodes')

class IPFirstDigit(db.Model):
    __tablename__ = 'ip_first_digit'
    id = db.Column(db.Integer, primary_key=True)
    first_digit = db.Column(db.Integer)
    description = db.Columnt(String(100))
    ipcodes = db.relationship("IPCodes", back_populates="first_digit")

class IPSecondDigit(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    second_digit = db.Column(db.Integer)
    description = db.Columnt(String(100))
    ipcodes = db.relationship("IPCodes", back_populates="second_digit")

Aber irgendwie kommt mir das "falsch" vor, weil ich ja dann 2 Klassen hätte die fast identisch wären.

Hat vielleicht jemand einen kleinen Schubs in die richtige Richtung?

Danke im Voraus.

Paddie

PS: Die Sonderfälle wie IPX... bzw die 3. und 4. Stelle habe ich extra komplett weg gelassen, da ich diese aktuell nicht benötige ;-)
 
Warum denn mehrere Tabellen für sowas simples? Eine Tabelle mit den Spalten die du da halt brauchst/willst reicht doch vollkommen?
 
Weil pos1 und pos2 unabhängige Größen sind => extra Dimension => extra Tabelle. Ob man das muß... sei dahingestellt, aber es ist sauber.

Per DB:
table Wasser (wId pk, description text)
table Staub (sId pk, description text)
table ipcert (wid fk wasser(wid), sid fk Staub(Sid), pk(Wid,Sid)

erlaubt auch Null in einer einzelnen Spalte, ggfs kann man aber auch mauscheln und einen ungültigen Wert für Null nehmen und so die Null aus dem zusammengesetzten pk raushalten.

re: Python muß ich allerdings passen. Da laß ich beide Finger von. 😉
 
  • Gefällt mir
Reaktionen: derPaddie
hmm.. OK, also lieg ich doch nicht soooo daneben ;-).

Wenn ich alles in eine Tabelle packe müsste ich ja dann eine Spalte mit der Position (also Wasser oder Fremdkörper und Berührung) dazupacken, da ja die Codes 1 - 6 auf beiden Stellen stehen könnten.

In welcher Sprache ist ja erstmal zweitrangig ;-P
 
ModellbahnerTT schrieb:
Eine Tabelle spricht gegen die Regeln die man bei Datenbanken einhalten sollte.

Das ist wohl korrekt, doch kann man sich sehr schnell "kaputt normalisieren" ;-). Ich glaube für dieses Problem hier ist das eine nette Fingerübung, doch zum Preis von sehr viel Overhead in den resultierenden Abfragen für eine recht statische Menge an möglichen Kombinationen.
 
Das mit dem viel Overhead war auch mein erster Gedanke..aber ich will es halt schon richtig machen. Zuerst wollte ich auch eigentlich nur eine Klasse für den IP-Code, also z. B. IP40 --> ...Beschreibung... aber irgendwie hab ich dann festgestellt, dass das ganz schön viele Kombinationen werden. Auch wenn einige eher unsinnig bzw. wohl gar nicht existent sind.
Mich "störten" halt irgendwie die zwei fast gleichen Klassen...deshalb meine Frage hier im Forum

Vielen Dank bis hier hin

Paddie
 
  • Gefällt mir
Reaktionen: new Account()
von der tabelle/DB hab ich null Tau, aber wenns dir um die digits Klassen geht, löse das über argumente für eine jeweisl neue Instanz?

Python:
class Digit(db.Model):
    def __init__(type='first'): # nimm erstes digit falls nicht anders angegeben
        digit_char = type
        id = db.Column(db.Integer, primary_key=True)
        digit = db.Column(db.Integer)
        description = db.Columnt(String(100))
        ipcodes = db.relationship("IPCodes", back_populates=type)

in Verwendung kann man es dann so machen:

Python:
1st_digit_instance = Digit()
2nd_digit_instance = Digit(type='second')
 
derPaddie schrieb:
Mich "störten" halt irgendwie die zwei fast gleichen Klassen
Falls die Programmiersprache es unterstützt kannst du auch Vererbung nutzen. Die Hauptklasse hat dann alles was gleich ist und die speziellen haben den Rest und erben von der Hauptklasse. Aber ob das python kann weiß ich nicht da ich kein python kann.
 
Zurück
Oben