Laden...

Hilfe bei Datenbankschema

Erstellt von t-master vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.088 Views
T
t-master Themenstarter:in
179 Beiträge seit 2007
vor 13 Jahren
Hilfe bei Datenbankschema

verwendetes Datenbanksystem: Sql Compact

Hi,
ich hab eine Tabelle zum Beispiel mit Büchern als Einträge.
Nun würde ich gerne in der Datenbank abspeichern, dass Buch A und Buch B ähnlich sind. Wie mach ich das am Besten?
Ich habs zuerst mit einer "BuchMap" versucht (Schema id; buchID; aehnlichesBuchID)
nur muss ich da ja dann die Beziehungen BuchMap:buchID - Buch:id und BuchMap:aehnlichesBuchID - Buch:id aufbauen und das lässt mich Visual Studio nicht machen.
Gibts da irgendeinen anderen Ansatz dafür?

Tobias

F
67 Beiträge seit 2010
vor 13 Jahren

Versuchs anders.

Du hast eine Tabelle Bücher(Schema:BuchID, Name).

Und dann machst du eine Tabelle Ähnlichkeiten(Schema: ID, BuchID1, BuchID2)

Brauchst dann nur noch die Beziehungen Bücher:BuchID - Ähnlichkeiten:BuchID1 und Bücher:BuchID - Ähnlichkeiten:BuchID2.

Also so... (Die Tabelle Bücher_1 wird als virtuelle Tabelle eingefügt. Also davon nicht beirren lassen)

V
162 Beiträge seit 2010
vor 13 Jahren

Hi,

es wäre schön wenn du dich etwas genauer erklärst.

  • Willst du wie in Online Shops unter einem Artikel, Ähnliche Produkte aufführen?
  • Willst du Bücher in Kategorien einteilen?
  • Zu diesem Artikel haben andere dies und das gekauft?

Es gibt eben viele Lösungen.

Für deine Einfache Frage hat FeelFlow die Antwort.

MfG
Björn

Das Leben ist schön!

T
t-master Themenstarter:in
179 Beiträge seit 2007
vor 13 Jahren

Hi,
nein, ich will einfach nur abspeichern, dass Buch X ähnlich ist wie Buch Y (und dann zum Beispiel anhand dessen Vorschläge für neue Bücher geben).
Von daher reicht FeelFlows Antwort völlig (bis auf die Fragen, gibt es virtuelle Tabellen überhaupt für SQL Server Compact Edition und wenn ja, wie erstell ich so eine Tabelle dann? )

Tobi

T
146 Beiträge seit 2004
vor 13 Jahren

Wozu brauchst du virtuelle Tabellen?

Nimm doch einfach 2 mal die Buch Tabelle, sollte ja das selbe sein.

Was dich diese Ähnlichkeit allerdings nicht selektieren lässt, dass ist die Art der Ähnlichkeit. Ein Buch kann ja nicht nur anhand eines Parameters "ähnlich" sein, von daher wirkt mir deine Anforderung als etwas zu dünn.

Ich würde in der Ähnlichkeit zumindest noch ne Art Kategorie oder sowas in der Art mitführen, alleine schon um die Geschichte einfach erweiterbar zu machen.

T
t-master Themenstarter:in
179 Beiträge seit 2007
vor 13 Jahren

Ok, wie genau meinst du das 2 mal nehmen?
Die Bücher-Tabelle 2x erstellen, mit 2x dem gleichen Inhalt?

F
67 Beiträge seit 2010
vor 13 Jahren

Die Tabelle erstellt er nur um das ganze besser visuell darstellen zu können. Ansonsten hat das keinen sinn. Du musst keine virtuelle Tabelle erstellen weil virtuell = gibts eh nich! Du musst einfach nur die 2 Beziehungen auf eine tabelle setzen!

T
146 Beiträge seit 2004
vor 13 Jahren

Nein, ich meinte, dass du BuchID1 und BuchID2 aus dem Beispielbild ja auch direkt nach Buch joinen lassen kannst, also einfach die Tabelle Buch 2 mal verwendest in deinem select. Dadurch brauchst du die gesamten Buchdaten nicht redundant, virtuell oder wie auch immer zusätzlich speichern.

// Pseudo


Select * from Ähnlichkeiten inner join
Bücher b1 on b1.id = Ähnlichkeiten.fk_Buch1 inner join
Bücher b2 on b2.id = Ähnlichkeiten.fk_Buch2
where ..............
orderby...............

Zumindest würde ich das so machen, und hab das auch schon öfter gemacht. Nachteile wären mir bisher nicht aufgefallen bei einer solchen Architektur, allerdings sollte ich davor warnen, dass manche Mapper, unter anderem LINq2SQL das nicht darstellen können, was sich aber Views leicht umgehen lässt.

F
67 Beiträge seit 2010
vor 13 Jahren

@Tom: Du machst da ganze Problem schwerer als es ist!

Dadurch brauchst du die gesamten Buchdaten nicht redundant, virtuell oder wie auch immer zusätzlich speichern.

In meinen Beispiel wird alles stinknormal gespeichert (nix virtuell). Die virtuelle Tabelle dient nur zur besseren darstellung der Beziehungen.

So wie du das machen willst, kann man nur eine ähnlichkeit pro buch vergeben...

T
146 Beiträge seit 2004
vor 13 Jahren

Unsere beiden Vorposts dürften sich zeitlich überlagert haben. Ich wollte eigentlich auf die Frage t-master antworten.

Warum sich meine Variante von deiner unterscheiden sollte ist mir allerdings nicht klar, ich kann da keinerlei Unterschied erkennen, wenn bei dir Bücher == Bücher_1 ist.

T
t-master Themenstarter:in
179 Beiträge seit 2007
vor 13 Jahren

Also,
a) Ich benutz als Mapper genau Linq2SQL ^^
b) Ich mach das ganze mit dem ServerExplorer von VisualStudio. Eine Beziehung von aehnlicheBuecher:buchID -> Buch:id funktioniert.
Die Beziehung aehnlicheBuecher:aehnlichesBuch ->Buch:id geht dann aber mit der Fehlermeldung "Die referenzielle Beziehung führt zu einem nicht zulässigen Zyklischen Verweis." nicht.

T
146 Beiträge seit 2004
vor 13 Jahren

genau davor hab ich dich vorhin schon gewarnt.

Am Einfachsten ist es jetzt, wenn du einen View generierst, der dir alle benötigten Daten liefert. Ich hoffe mal SQL Server Compact, oder wie der heisst, kann überhaupt views 🙂

T
t-master Themenstarter:in
179 Beiträge seit 2007
vor 13 Jahren

Ok, Sql CE unterstützt keine Views 😕

Irgendeinen Vorschlag bzgl. einer anderen Methode (oder einer anderen Datenbank, die keinen extra installierten Server braucht?)

F
67 Beiträge seit 2010
vor 13 Jahren

Also das Beispiel oben habe ich in Access erstellt. Damit scheint es zu funktionieren. Vielleicht probierst du es damit!

5.299 Beiträge seit 2008
vor 13 Jahren

Also,
a) Ich benutz als Mapper genau Linq2SQL ^^
b) Ich mach das ganze mit dem ServerExplorer von VisualStudio. Eine Beziehung von aehnlicheBuecher:buchID -> Buch:id funktioniert.
Die Beziehung aehnlicheBuecher:aehnlichesBuch ->Buch:id geht dann aber mit der Fehlermeldung "Die referenzielle Beziehung führt zu einem nicht zulässigen Zyklischen Verweis." nicht.

Die Beziehung ist auch falsch rum. Du brauchst die Beziehungen


Buch -> Aehnlichkeit.Buch1
Buch -> Aehnlichkeit.Buch2

die AehnlichkeitsTabelle sollte nicht aehnlicheBuecher heißen, denn dort sind keine Bücher drin, sondern nur Verweise zu büchern, die als ähnlich gelten sollten.

mein L2S hat kein Prob damit (eine SqlDB aufzusetzen habichmirmal erspart):

Der frühe Apfel fängt den Wurm.