[MySQL] Relatie tabellen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Mebus
  • Registratie: September 2006
  • Laatst online: 19-09 13:37
Ik maak momenteel een website met NodeJS, ExpressJs, PassportJS en SequelizeJS. Nu heb ik alleen een probleem met de relaties tussen de MySQL tabellen waar ik maar niet uitkom.. Nooit echt een ster geweest in MySQL maar weet meestal zelf een oplossing te vinden op internet/google.

Met PassportJS kunnen gebruikers inloggen d.m.v. Facebook/Twitter waarbij ik voorlopig nu alleen gebruik maak van Facebook. Dit gaat allemaal goed en werkt zonder problemen. Natuurlijk wil je ook dat mensen die ingelogd zijn berichtjes kunnen plaatsen en ik als 'Beheerder' blogposts kan toevoegen. En hier loop ik tegen een relatie probleem:
Afbeeldingslocatie: https://s32.postimg.org/oigi6uohh/SQL_relaties.png

Als ik nu alle Blogposts ophaal gaat dit goed, en ook de gegevens die staan in de Users tabel. Maar als ik nu ook nog eens de informatie haal uit facebooklogins dan krijg ik een foutmelding: FacebookLogin is not associated to User.

Ik heb ook al wat geprobeerd met BelongsToMany maar hier kom ik ook niet veel verder mee en krijg ik dezelfde foutmelding :(

code:
1
2
3
db.FacebookLogin.belongsTo(db.User);
db.TwitterLogin.belongsTo(db.User);
db.BlogPost.belongsTo(db.User);

code:
1
2
3
4
5
6
7
8
9
10
        models.BlogPost.findAll(
        {
            include:
            [{
                model: models.User
            }]
        }).then(function(posts)
        {
            res.send(posts);
        });


Zijn mijn relaties niet goed of kan ik zelfs beter nog een hele andere setup gebruiken? Voor mij ziet deze setup er verder goed uit omdat ik zo geen lege velden heb in mijn database.

BABYMETAL LoL - Twitch


Acties:
  • 0 Henk 'm!

  • wwwFan
  • Registratie: Januari 2012
  • Laatst online: 20:49
Volgens je database schema is de relatie users - facebooklogins een 1 op m relatie. Dit lijkt me wat onlogisch. Een 1 op 1 relatie lijkt me hier van toepassing. Dan kans je wel bij een User het bijbehorende facebooklogin record vinden.

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 23:32
Kan je in de log niet opvragen welke queries hij maakt? Dan zie je ook wat er op de achtergrond precies fout gaat.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 10-10 17:57
Even een wilde gok, aangezien ik die frameworks en je code niet ken: Maar vanuit BlogPost wordt alleen de Users (Tabel) ge-include en niet de submodellen Twitterlogins en Facebooklogins?

let the past be the past.


Acties:
  • 0 Henk 'm!

  • Mebus
  • Registratie: September 2006
  • Laatst online: 19-09 13:37
SPee schreef op zaterdag 30 juli 2016 @ 17:25:
Even een wilde gok, aangezien ik die frameworks en je code niet ken: Maar vanuit BlogPost wordt alleen de Users (Tabel) ge-include en niet de submodellen Twitterlogins en Facebooklogins?
Het includen van de User tabel gaat zonder problemen, maar zodra ik ook de FacebookLogins en TwitterLogins tabel wil includen krijg ik een foutmelding..
CurlyMo schreef op zaterdag 30 juli 2016 @ 14:53:
Kan je in de log niet opvragen welke queries hij maakt? Dan zie je ook wat er op de achtergrond precies fout gaat.
Ik zal even logging aanzetten ja, dat had ik uitgezet in mijn config.

code:
1
 SELECT `BlogPost`.`id`, `BlogPost`.`title`, `BlogPost`.`summary`, `BlogPost`.`message`, `BlogPost`.`createdAt`, `BlogPost`.`updatedAt`, `BlogPost`.`deletedAt`, `BlogPost`.`UserId`, `User`.`id` AS `User.id`, `User`.`type` AS `User.type`, `User`.`createdAt` AS `User.createdAt`, `User`.`updatedAt` AS `User.updatedAt`, `User`.`deletedAt` AS `User.deletedAt` FROM `BlogPosts` AS `BlogPost` LEFT OUTER JOIN `Users` AS `User` ON `BlogPost`.`UserId` = `User`.`id` AND `User`.`deletedAt` IS NULL WHERE `BlogPost`.`deletedAt` IS NULL;
wwwFan schreef op zaterdag 30 juli 2016 @ 13:30:
Volgens je database schema is de relatie users - facebooklogins een 1 op m relatie. Dit lijkt me wat onlogisch. Een 1 op 1 relatie lijkt me hier van toepassing. Dan kans je wel bij een User het bijbehorende facebooklogin record vinden.
BelongsTo is volgens de documentatie een 1 op 1 relatie? http://docs.sequelizejs.c...s/associations/#belongsto

[ Voor 41% gewijzigd door Mebus op 30-07-2016 20:25 ]

BABYMETAL LoL - Twitch


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Als ik de documentatie wat vluchtig doorlees, krijg ik de indruk dat de auteur het begrip 1-op-1 wat liberaal gebruikt. Het lijkt erop dat "belongsTo" in werkelijkheid een n-op-1 relatie maakt. Zie ook het voorbeeld in de documentatie: Player.belongsTo(Team). Dit maakt een team id aan in player. Een player zit daardoor altijd in maar 1 team, maar een team kan uit meer spelers bestaan.
Dat is denk ik ook wat in jouw geval fout gaat. Als je zegt: FacebookLogins.belongsTo(User), dan hoort bij iedere facbook login precies 1 user, maar een user kan meer facebook logins hebben. Als je dan zegt: "geef mij de blogpost, met zijn user, en de facebook login van die user" dan kunnen daar dus meer facebook logins bij horen.
Je kan proberen "hasOne" te gebruiken in plaats van "belongsTo":

User.hasOne(FacebookLogin).

Hierdoor komt de relatie andersom te liggen, en kan je dus van een user de bijbehorende facebook login vinden.

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Daarnaast: je Facebook- en Twitter-logintabellen zijn exact gelijk. Waarom is het niet gewoon één tabel met een type-veldje? Wat ga je doen als je later support voor een derde medium wil toevoegen? Blijf je onbeperkt tabellen toevoegen tot je halve database bestaat uit vrijwel identieke tabellen? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 10-10 00:29

xleeuwx

developer Tweakers Elect
wwwFan schreef op zaterdag 30 juli 2016 @ 13:30:
Volgens je database schema is de relatie users - facebooklogins een 1 op m relatie. Dit lijkt me wat onlogisch. Een 1 op 1 relatie lijkt me hier van toepassing. Dan kans je wel bij een User het bijbehorende facebooklogin record vinden.
0 op 1 relatie anders zou elke user een facebook en twitter login moeten hebben.

Daarnaast is je tabel met een lowercase en je foutmelding met een uppercase:
code:
1
FacebookLogin


Geen idee of dit de fout is maar wel opmerkelijk :)

[ Voor 4% gewijzigd door xleeuwx op 02-08-2016 16:05 ]


Acties:
  • 0 Henk 'm!

  • Mebus
  • Registratie: September 2006
  • Laatst online: 19-09 13:37
Ik heb het uiteindelijk zo opgelost:
code:
1
2
db.User.belongsTo(db.FacebookLogin);
db.BlogPost.belongsTo(db.User);


FacebookLogins is uiteindelijk alleen maar een tabel die logins linkt aan de Facebook Api. Alles wat gebruikt kan worden voor het profiel/sessie staat natuurlijk in de User tabel :)
NMe schreef op dinsdag 02 augustus 2016 @ 10:35:
Daarnaast: je Facebook- en Twitter-logintabellen zijn exact gelijk. Waarom is het niet gewoon één tabel met een type-veldje? Wat ga je doen als je later support voor een derde medium wil toevoegen? Blijf je onbeperkt tabellen toevoegen tot je halve database bestaat uit vrijwel identieke tabellen? ;)
Uiteindelijk wil ik ook een enkele user kunnen koppelen aan verschillende login methodes, zodat als bijvoorbeeld Facebook down is ze nog wel steeds kunnen inloggen via Twitter. Kan ik dan zeker het beste een tussen tabel plaatsen tussen PassportLogin (voor als ik een enkele tabel ga gebruiken) en User om de gegevens aan elkaar te linken? Zo lijkt het mij ook het beste om onnodige velden te vermijden of dubbele records? Want ik heb nu in mijn User tabel het veld FacebookLoginId, maar als daar ook nog eens TwitterLoginId bij komt en andere dan krijg ik natuurlijk snel lege velden en dat willen we niet.
xleeuwx schreef op dinsdag 02 augustus 2016 @ 16:04:
[...]

0 op 1 relatie anders zou elke user een facebook en twitter login moeten hebben.

Daarnaast is je tabel met een lowercase en je foutmelding met een uppercase:
code:
1
FacebookLogin


Geen idee of dit de fout is maar wel opmerkelijk :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
"use strict";

module.exports = function(sequelize, DataTypes)
{
    var FacebookLogin = sequelize.define('FacebookLogin',
    {
        facebook_id: //bigint causes problems with javascript, make it a string
        {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        facebook_token:
        {
            type: DataTypes.TEXT,
            allowNull: false
        },
        facebook_username:
        {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        facebook_email:
        {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        facebook_profile_picture:
        {
            type: DataTypes.TEXT
        }
    },
    {
        paranoid: true,
        getterMethods:
        {
            strategy: function()  { return 'Facebook' }
        }
    });
    return FacebookLogin;
};


Sequelizejs maakt van FacebookLogin: facebooklogins. Dit werkt dus voor zover ik weet gewoon goed ;)

@Rotterdammertje, ik zal me wat meer gaan verdiepen in relaties met MySQL :)

BABYMETAL LoL - Twitch


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Mebus schreef op woensdag 03 augustus 2016 @ 20:14:
Uiteindelijk wil ik ook een enkele user kunnen koppelen aan verschillende login methodes, zodat als bijvoorbeeld Facebook down is ze nog wel steeds kunnen inloggen via Twitter. Kan ik dan zeker het beste een tussen tabel plaatsen tussen PassportLogin (voor als ik een enkele tabel ga gebruiken) en User om de gegevens aan elkaar te linken? Zo lijkt het mij ook het beste om onnodige velden te vermijden of dubbele records? Want ik heb nu in mijn User tabel het veld FacebookLoginId, maar als daar ook nog eens TwitterLoginId bij komt en andere dan krijg ik natuurlijk snel lege velden en dat willen we niet.
Dan is het nog steeds one-to-many. Een gebruiker kan meerdere logins hebben, maar een login kan nooit bij meerdere gebruikers horen. Geen koppeltabel nodig dus. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1