Jump to content
php.lv forumi

Divu tabulu linkošana


MZM

Recommended Posts

Problēma: ir divas tabulas A un B. Tabulas A ierakstam var piederēt neierobežots skaits ierakstu tabulā B un pretēji (tabulas B ierakstam var piederēt neierobežots skaits ierakstu tabulā A). Vajaga izdomāt efektīvu prijomu kā no tabulas B iehavot tabulas A ntajam ieraxtam piederošos tabulas B ieraxtus un pretēji (B tabulas ieraxtam piederošos A tabulas ieraxtus).

Inetā piemēros parasti dotā operācija ir tikai 1 virziena (A var piederēt daudzi B), bet man vajag, ka A "n" var piederēt visi B, A "n+1" tie paši B un arī pretējā virzienā.

Ārpus MySQL šo problēmu varētu atrisināt izmantojot masīvu ar A kolonām un B rindām atbilstošos krustpunktos ieliekot 0 vai 1, bet MySQL tabula != masīvs :( Googlei arī nemāku pajautāt, jo nevaru īsi noformulēt jautājumu :)

Protams, ka risinājumam jābūt dinamiski lietojamam, jo A un B saturs nav statisks :)

Link to comment
Share on other sites

Vakar biju pārāk noguris, lai iedotu piemēru.

Piemērs (tā kā MySQL šobrīd nau pa rokai, var būt neprecīza sintakse):

Tabula A:

create table A (id int(14) auto_increment primary key, os varchar(25));
insert into table A (os) values ("Window$");
insert into table A (os) values ("Linux");
insert into table A (os) values ("BSD");

Tabula B:

create table B (id int(14) auto_increment primary key, arch varchar(25));
insert into table A (arch) values ("i386");
insert into table A (arch) values ("ppc");
insert into table A (arch) values ("alpha");

Pēc apsekošanas tika iegūti dati, ka

1) uz i386 iet win, lin un bsd;

2) uz ppc iet lin un bsd;

3) uz alpha iet lin un bsd.

Kā to saglabāt datu bāzē tā, lai ātri varētu noskaidrot :

A) uz kādām arch iet konkrētā OS;

B) kādas OS iet uz konkrētās arch.

 

Kā redzams no piemēra, vienam ieraxtam iekš A var atbilst vairāki iekš B un otrādi;

Būtu labi, ja piedāvātais risinājums būtu ātrs, jo reālajā dzīvē A un B var saturēt vairākus tūkstošus ieraxtu;

Risinājumam vajadzētu būt flexiblam -> ja nu nopērk sparc ar solaris ;)

Incē tikai teorija, gan jau ar implementāciju tikšu galā (varbūt) ;)

 

TNX par jebkādām idejām/manuāliem/RTFM'iem ;)

Link to comment
Share on other sites

Manuprāt, risinājums ir tieši tāds, kādu piedāvāju - trešā tabula. Tavā gadījumā pat nevajag kolonnu virziens, jo, ja teiz uz i386 iet solaris :D, tad viena no solaris platformām ir i386.

attiecīgi varam kolonnas nosaukt os_ID un arch_ID.

SELECT A.os FROM A, C WHERE C.os_ID = A.id AND C.arch_ID = {tevi interesējošās arhitektūras ID}

līdzīgi darbojas pretējā virzienā.

Link to comment
Share on other sites

  • 3 weeks later...
×
×
  • Create New...