[mysql/asp] relaties tussen 2 databases

Pagina: 1
Acties:

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Goeie avond,

Ik kom na lange tijd weer eens iets tegen waar ik een probleem mee heb. Het gaat om het volgende:

Op 2 verschillende domeinen (a.nl, b.nl) heb ik een database. Echter hebben deze wel een relatie met elkander.
op a.nl staan in de database de users + gegevens. b.nl wil deze usertabel gebruiken zodat je shared users hebt. Het grote probleem is echter dat er volgens mij geen manier is om uit 2 verschillende databases data te halen dmv 1 query als je fysiek andere servers hebt.

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
'connect db
'-------------------------------------------------
set fp_db = new db
fp_db.name_ = "db1_name"
fp_db.path_ = "mysql.db1.nl"
fp_db.uid_  = "db1_uid"
fp_db.pass_ = "db1_pass"    

message = fp_db.connect_()
if not message = true then c_error.die(message)


set fo_db = new db
fo_db.name_ = "db2_name"
fo_db.path_ = "mysql.db2.nl"
fo_db.uid_  = "db2_uid"
fo_db.pass_ = "db2_pass"    

message = fo_db.connect_()
if not message = true then c_error.die(message)
'-------------------------------------------------


db class
Visual Basic:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<%

Class db
    
    private f_db_name
    private f_db_path
    private f_db_uid
    private f_db_pass
    private adoCon
    private rs1
    private rs2
    private current_open_queries
    private total_queries
    private total_db_time
    
    Private Sub Class_Initialize()

        f_db_name = "" 
        f_db_path = ""
        f_db_uid  = ""
        f_db_pass = ""  
        adoCon    = ""
        Set rs1 = Server.CreateObject("ADODB.Recordset")
        Set rs2 = Server.CreateObject("ADODB.Recordset")
        
    end Sub
    
    Public Property Get name_
        name_ = f_db_name
    End Property
    Public Property Let name_(ByVal strdb_name)
        f_db_name = strdb_name
    End Property

    Public Property Get path_
        path_ = f_db_path
    End Property
    Public Property Let path_(ByVal strdb_path)
        f_db_path = strdb_path
    End Property
    
    Public Property Get uid_
        uid_ = f_db_uid
    End Property
    Public Property Let uid_(ByVal strdb_uid)
        f_db_uid = strdb_uid
    End Property
    
    Public Property Get pass_
        pass_ = f_db_pass
    End Property
    Public Property Let pass_(ByVal strdb_pass)
        f_db_pass = strdb_pass
    End Property

    Public Property Get open_queries_
        open_queries_ = current_open_queries
    End Property

    Public Property Get total_queries_
        total_queries_ = total_queries
    End Property
    
    Public Property Get total_query_time_
        total_query_time_ = total_db_time
    End Property

    public function connect_()

        on error resume next
    
        Set adoCon = Server.CreateObject("ADODB.Connection")
        adoCon.CursorLocation = 2
        adoCon.connectionstring = "Provider=MSDASQL;Driver={MySQL ODBC 3.51 Driver};Server=" & f_db_path & ";Database=" & f_db_name & ";UID=" & f_db_uid & ";PWD=" & f_db_pass & ";OPTION=3"
        adoCon.Open
        
        If Err.number <> 0 then 
            connect_ = "connection_error"
        else
            connect_ = true
        end if

        On Error Goto 0 
        
    end function

    [knip andere functies]
    
End Class
%>


Se grote vraag is nu hoe ik in 1 query (of in meerdere zolang het maar geen in while loop queries worden) gegevens uit deze 2 databases kan halen. een idee als in 1 query meerdere db's aanroepen is volgens mij geen optie omdat deze servers fysiek anders zijn...

Volgens mij heeft react ook een dergelijk systeem met shared users op verschillende fora. Kan iemand me uitleggen of dit hetzelfde principe is etc, en hoe het daar werkt?

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
??? Wat is het probleem met je code ( geen zin om het helemaal door te lezen ), want je moet gewoon 2 dbase instanties openen en ze dan 1 voor 1 aanspreken...

Je kunt niet in je sql tegelijkertijd 2 dbases aanspreken ( AFAIK ) maar ipv joins in sql gewoon eerst 1 query doen en het resultaat in query 2 stouwen levert volgens mij hetzelfde resultaat op ( niet performancegewijs en helemaal niet bij uitgebreidere querys / joins, maar voor de basis moet het wel werken )

En of het while loops worden ligt helemaal aan jezelf, als je 15 resultaten uit query1 krijgt en je wil ze alle 15 doorzetten naar query kun je inderdaad gaan loopen, of je kunt IN sql querys opbouwen
code:
1
select * where PK IN ( waarde1,waarde2,waarde3 etc )

Hiermee haal je denk ik al een heleboel while loops weg.
Nogmaals ingewikkelde querys moet je hier niet mee willen bouwen, maar voor de simpele querys werkt het best wel met IN / while loops.

Verwijderd

Kun je met MySQL niet twee databases koppelen?

In SQL server was dit voor mij destijds een prima oplossing. Op de ene DB had ik een View van data van de andere DB.

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Verwijderd schreef op dinsdag 05 september 2006 @ 00:26:
Kun je met MySQL niet twee databases koppelen?

In SQL server was dit voor mij destijds een prima oplossing. Op de ene DB had ik een View van data van de andere DB.
ik heb werkelijk geen flauw idee. ik heb al gegoogled op: 'multiple databases mysql' etc maar het leverde weinig op. Heb jij misschien een suggestie waarmee ik kan zoeken naar of dit mogwelijk is?
Gomez12 schreef op dinsdag 05 september 2006 @ 00:18:
??? Wat is het probleem met je code ( geen zin om het helemaal door te lezen ), want je moet gewoon 2 dbase instanties openen en ze dan 1 voor 1 aanspreken...

Je kunt niet in je sql tegelijkertijd 2 dbases aanspreken ( AFAIK ) maar ipv joins in sql gewoon eerst 1 query doen en het resultaat in query 2 stouwen levert volgens mij hetzelfde resultaat op ( niet performancegewijs en helemaal niet bij uitgebreidere querys / joins, maar voor de basis moet het wel werken )

En of het while loops worden ligt helemaal aan jezelf, als je 15 resultaten uit query1 krijgt en je wil ze alle 15 doorzetten naar query kun je inderdaad gaan loopen, of je kunt IN sql querys opbouwen
code:
1
select * where PK IN ( waarde1,waarde2,waarde3 etc )

Hiermee haal je denk ik al een heleboel while loops weg.
Nogmaals ingewikkelde querys moet je hier niet mee willen bouwen, maar voor de simpele querys werkt het best wel met IN / while loops.
die IN methode is idd een oplossing, maar wel een omweg als er een manier is om gewoon met 2 databases te werken.

[ Voor 61% gewijzigd door Mischa_NL op 05-09-2006 00:31 ]


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik denk dat ik de perfecte oplossing heb!

Ik genereer dmv xml een soort tussentable met daarin de (nuttige) gegevens die ik nodig heb uit de database (alle users). dit doe ik zo dat het staat op de PK. hierdoor doe je een singlenode selection op user_{PK} en kun je daar naam, email etc uithalen!
Ik snap dat het performancewijze niet geweldig zal zijn als je +5.000/10.000 users hebt oid.
Ik denk dat je met een app waar ik verwacht niet meer dan 3.000 users te krijgen dit best haalbaar is. klopt dit of zou dit performancewijze echt gigantisch stom zijn?

/edit

oplossing zoals altijd 'apart' (dus dubbel) gepost

[ Voor 5% gewijzigd door Mischa_NL op 05-09-2006 01:27 ]


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Waarom dan xml??? Waarom laat je dbase 1 dan niet gelijk periodiek een tabel in dbase 2 vullen met nuttige gegevens??? Laat dit 1x per uur / dag doen ( of gooi een actie op een invoer in dbase 1 ).

Dat hele gedoe met xml, waarom moeilijk doen als je het ook in 1x native kan doen.

Op zich denk ik wel dat het de beste manier is, alle normale querys kun je dan altijd local binnen dbase 2 draaien. Wil je op een gegeven moment een rapport / overzicht maken dan kan je altijd nog via while loopjes / in querys ook dbase 1 erbij betrekken. Maar het gros van de dagelijkse werkzaamheden kunnen lokaal in dbase 2 gebeuren... Alleen de uitzonderingen duren dan iets langer maar ja. Daarom zijn het ook uitzonderingen.

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Toevallig nog bezig geweest met een dergelijke join in MS-SQL. In MS-SQL kun je gewoon een Linked Server aanmaken. Met de 4 part notation kun je dan een tabelverwijzing doen.
[linked_servername].[databasename].[owner].[tablename]

Ondersteunt MySQL geen linked servers?
Misschien kan je daar eens op zoeken

It’s nice to be important but it’s more important to be nice


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Gomez12 schreef op woensdag 06 september 2006 @ 00:56:
Waarom dan xml??? Waarom laat je dbase 1 dan niet gelijk periodiek een tabel in dbase 2 vullen met nuttige gegevens??? Laat dit 1x per uur / dag doen ( of gooi een actie op een invoer in dbase 1 ).

Dat hele gedoe met xml, waarom moeilijk doen als je het ook in 1x native kan doen.

Op zich denk ik wel dat het de beste manier is, alle normale querys kun je dan altijd local binnen dbase 2 draaien. Wil je op een gegeven moment een rapport / overzicht maken dan kan je altijd nog via while loopjes / in querys ook dbase 1 erbij betrekken. Maar het gros van de dagelijkse werkzaamheden kunnen lokaal in dbase 2 gebeuren... Alleen de uitzonderingen duren dan iets langer maar ja. Daarom zijn het ook uitzonderingen.
Omdat je op deze manier met asp makkelijk een singlenode kunt selecten. Wil je met array's gaan werken gaat dit zeer lastig.

Daarnaast waarom niet die tabel dubbel opslaan? ten eerste: dan moet ik in mijn andere applicatie gaan bouwen en dat is níet de bedoeling.
Daarnaast is het ook veel gevoeliger voor fouten dan deze manier.

Maar kwa performance denk ik dat dit best te doen is.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 21:42

MBV

ehm, is ASP zo'n slechte taal? Kwestie van op de goede manier vullen. Zoiets zou ik doen:
PHP:
1
2
3
4
5
6
7
8
9
$output = array();
foreach ($dbresults as $value)
{
  $output[$value['PrimaryKey']] = array(
                                   'waarde1' => $value['waarde1']
                                   'waarde2' => $value['waarde2']
                                   'waarde3' => $value['waarde3']
  );
}

en dan om op te vragen:
PHP:
1
print_r($output[$id]);

als je print_r ervoor wilt gebruiken dus ;)

  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
MBV schreef op woensdag 06 september 2006 @ 22:39:
ehm, is ASP zo'n slechte taal? Kwestie van op de goede manier vullen. Zoiets zou ik doen:
PHP:
1
2
3
4
5
6
7
8
9
$output = array();
foreach ($dbresults as $value)
{
  $output[$value['PrimaryKey']] = array(
                                   'waarde1' => $value['waarde1']
                                   'waarde2' => $value['waarde2']
                                   'waarde3' => $value['waarde3']
  );
}

en dan om op te vragen:
PHP:
1
print_r($output[$id]);

als je print_r ervoor wilt gebruiken dus ;)
tja dat kan dus niet mwehe.
Pagina: 1