Primary Key und 1:N Relationen

  • Antworten:22
  • Bentwortet
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 02:16:57 via Website

Hallo,

bin wahrlich kein Experte in Sachen Datenbanken, daher mal folgende Frage:

Ich habe eine 1:N Relation, im Java Code hat ein Objekt viele Referenzen auf Zeitpläne (repeat).

1CREATE TABLE IF NOT EXISTS schedule_repeat_relation (_id INTEGER PRIMARY KEY AUTOINCREMENT, selectedid INTEGER, repeatid INTEGER)

1CREATE TABLE IF NOT EXISTS repeat (_id INTEGER PRIMARY KEY AUTOINCREMENT, weekday INTEGER, daytime LONG, activ BOOLEAN);

Nun sind diese Repeats alle recht trivial, was momentan auch mein Problem ist, da Ich nicht garantieren kann das es diesen Repeat nicht schon mal in der gleich Form bereits in der Tabelle repeat gibt. Füge Ich nun einen repeat in die Tabelle ein müsste Ich für meine relation den primary key des repeat kennen.
Einen Insert über SQLDatabase#insert liefert mir doch leider nur die ROW ID was mir nicht weiterhilft, auch einen Trigger habe Ich schon versucht zu schreiben, doch auch hier habe Ich das Problem das Ich bei dieser Relation immernoch nicht den PRIMARY KEY in der schedule_repeat_relation kenne.

Hier mein trigger versuch der leider das Problem nicht löst:


1CREATE TRIGGER IF NOT EXISTS repeat_insert_trigger AFTER INSERT ON repeat
2 BEGIN
3
4 INSERT INTO schedule_repeat_relation (scheduleid, repeatid) values (new.scheduleid,new._id);
5 END


Also, man kann das Problem grob darauf zusammen-stutzen das Ich nicht weiß wie Ich an den Primary Key eines Objektes kommen kann ohne das der Eintrag in der Tabelle eindeutig ist.
Ich brauche also Foreign Keys, was SQLite leider nicht unterstützt. Die einzige lösung die mir momentan einfällt ein Dummy Feld in der Tabelle repeat einzufügen welches Ich z.b mit den Nanosekunden fülle, und mir diese merke um danach einen entsprechenden Primary key ermitteln zu können der auch wirklich zu dem Eintrag gehört.

Gibt es Ideen hierzu ? Oder stehe Ich total auf dem Holzweg ?

Danke für Anregungen,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 09:10:12 via Website

Oder stehe Ich total auf dem Holzweg ?

Ja.


Ein "SELECT MAX (_id) from repeat" liefert mir den Primary Key!

- Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Christian Grasser
  • Forum-Beiträge: 380

12.02.2010, 09:47:43 via Website

Warum verwendest du nicht den SQLiteOpenHelper?
Der gibt dir beim .insert auch die ID zurück.

Dann hast du auch die onUpgrade Methoden usw... die brauchst du doch auch sobald du das app upgraden willst.

Insert:
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert%28java.lang.String,%20java.lang.String,%20android.content.ContentValues%29

— geändert am 12.02.2010, 09:48:55

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 10:05:48 via Website

Du weist schon das rowID != primary key ist ?

PS: Wo steht das Ich ein Problem mit dem Updaten der DB habe ?

— geändert am 12.02.2010, 10:09:58

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

12.02.2010, 10:49:00 via Website

Mac Systems
Oder stehe Ich total auf dem Holzweg ?

Ja.


Ein "SELECT MAX (_id) from repeat" liefert mir den Primary Key!

- Mac

ich habs auch überall so gemacht. eigentlich schade, dass es da nichts anderes gibt

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 10:51:20 via Website

Erst ab SQLite 3.6.22

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Christian Grasser
  • Forum-Beiträge: 380

12.02.2010, 14:40:20 via Website

Mac Systems
Du weist schon das rowID != primary key ist ?

Verstehe ich jetzt nicht ganz, denn das insert liefert mir die row ID zurück, also die _ID des AUTOINCREMENT Wertes oder?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

12.02.2010, 15:13:41 via Website

Überlege mal was bei einem delete passiert ;)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Christian Grasser
  • Forum-Beiträge: 380

12.02.2010, 15:58:29 via Website

Was soll da passieren? Da wird der Satz gelöscht den ich angebe :-) :-)
Die delete Funktion vom SQLiteOpenHelper liefert mir die Anzahl an gelöschten Sätzen zurück ...

Was meinst du denn jetzt?

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

13.02.2010, 04:11:57 via Website

Es geht nicht um das direkte delete, nur das ein delete die RowID ändert nicht den Primary Key des nächsten Inserts!

Daher RowID != Primary Key

Oder:

a Insert = (rowID = 0) (PK = 1)
a delete
a insert = (rowID = 0) (PK = 2)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Christian Grasser
  • Forum-Beiträge: 380

13.02.2010, 10:38:50 via Website

Das ist falsch was du da schreibst.
rowId == Primary Key

a insert = rowId 0
a delete
a insert = rowId 1

Der primary key ist das _id Feld in der Datenbank dass mit autoincrement hochgezählt wird.
Der autoincrement Wert erhöht sich IMMER, da wird nicht der höchste Wert oder Lücken aufgefüllt.

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

13.02.2010, 10:42:41 via Website

Christian Grasser
Das ist falsch was du da schreibst.
rowId == Primary Key

a insert = rowId 0
a delete
a insert = rowId 1

Der primary key ist das _id Feld in der Datenbank dass mit autoincrement hochgezählt wird.
Der autoincrement Wert erhöht sich IMMER, da wird nicht der höchste Wert oder Lücken aufgefüllt.

das stimmt

swordiApps Blog - Website

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

13.02.2010, 10:46:54 via Website

Warum verwendest Du denn im INsert in die Schedule Tabelle nicht einfach ein Sub-Select im Insert das die Max(_ID) aus der repeat Tabelle ermittelt

Also etwa so ...

1insert into schedule_repeat_relation (_id, selectedid,repeatid)
2values (2, 100,(select max(_id) from repeat))

(Autoincrement _id ist hier nur manuell gesetzt, was aber fürs prinzip egal ist)

Das kannst du theoretisch auch im Trigger so lösen, was Dir das manuelle Insert sparen würde.

lg Voss

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

14.02.2010, 13:36:33 via Website

Der primary key ist das _id Feld in der Datenbank dass mit autoincrement hochgezählt wird.
Der autoincrement Wert erhöht sich IMMER, da wird nicht der höchste Wert oder Lücken aufgefüllt.

Wo kann Ich so etwas nachlesen ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.02.2010, 09:31:01 via Website

Das mit dem erhöht sich immer ist ggf. so eine Sache.

Bei Load balanced Systemen ist genau das nämlich nicht unbedingt gegeben. Es gibt durchaus Datenbank-Systeme bei denen dieses Autoincrement bei load-balanced Systemen nicht von Haus aus dafür eingerichtet ist und dann bekommt man mit diesen sogn. Sequences u.U. Probleme. Eine frühere Sequence muss dabei nicht zwingend niedriger sein als eine spätere. Sie mag unique sein, aber nicht ordered oder sequentiell.

Eine durch Autoincrement verwaltete Sequence muss bsp. nicht unbedingt aufeinanderfolgend sein. Es können hier durch diverse Umstände durchaus Lücken im Increment auftreten. Also bitte NIEMALS auf das Autoincrement von "1" verlassen. Bei Load-Balanced Systemen wird das ggf. je nach Datenbank noch wichtiger.

lg Voss

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

15.02.2010, 09:35:50 via Website

Thx, ich hab wieder was gelernt :)

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

15.02.2010, 09:36:12 via Website

aber es geht hier um eine anwendung am smartphone.

da sind wir wohl noch weit weg von einem load balancer ;)

und vor allem ist es total egal, wenn der primary key da eine lücke hat. er dient ja nur zur identifikation und wenn da ein wert dazwischen leer ist - ist ja völlig egal

swordiApps Blog - Website

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.02.2010, 09:52:45 via Website

Schon klar Markus, auf Smartphones werden wir in der Regel keine balanced DB's haben ;)

Ob es egal ist das der Primary Key Lücken aufweist, hängt schlicht von der Art und Weise der Implementierung ab. Verlässt man sich da auf sequentielle Abfolge oder rechnet gar damit kann es in die Hose gehen.

Prinzipiell hast Du recht bei vernünftigen Implementierungen, grundsätzlich ist es aber nicht soo egal wie man glauben mag.

lg Voss

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

15.02.2010, 10:01:43 via Website

naja

meistens hat man 2 tabellen und in der zweiten dient der primary der ersten als foreign der 2.

von daher ist es völlig egal, welchen wert der primary der ersten hat. hauptsache ist gleich dem foreign ;)

wenn man eine sequentielle abfolge unbedingt nötig hat, dann sollte man sich sowieso was überlegen

swordiApps Blog - Website

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

15.02.2010, 10:01:46 via Website

If a table contains a column of type INTEGER PRIMARY KEY, then that column becomes an alias for the ROWID. You can then access the ROWID using any of four different names, the original three names described above or the name given to the INTEGER PRIMARY KEY column. All these names are aliases for one another and work equally well in any context.

Das beißt sich dennoch ein wenig mit der API die einen long liefert. Ist das so gewählt damit bei eigenen Primary Key der größtmögliche Zahlenraum zur Verfügung steht ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

15.02.2010, 11:07:34 via Website

auf Smartphones werden wir in der Regel keine balanced DB's haben ;)

Ich fands trotzdem gut das du das näher erläutert hast, denn hier lesen bestimmt auch Leute mit, die das nicht wußten und/oder nicht darüber nachdenken;
ein paar (wackelige) sql statements sind ja schnell mal für ein anderes (nicht Smartphone-) Projekt kopiert und zack -- gehts nicht mehr und der Kopierer weiß nicht, warum.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.02.2010, 14:03:16 via Website

Genau so ist es And Dev. :grin: Und warum nicht mal aus der Schule plaudern .. man muß ja schließlich nicht immer alles Wissen für sich behalten.

Insbesondere bei ORACLE RAC (Real Application Cluster) Systemen ist hier übrigens extreme Vorsicht geboten was die Sequences angeht.

— geändert am 15.02.2010, 14:03:53

lg Voss

Antworten