Jump to content
php.lv forumi

viena primary key vs. daudzas primary key


codez

Recommended Posts

Ir Tabula1 ar laukiem A,B,C,DATI, kur A,B,C ir primary keys

Tabula1
-------
A (primary key)
B (primary key)
C (primary key)
DATI

 

un ir Tabula2, kurā arī ir lauki A,B,C, kuri norāda uz Tabula1 A,B,C laukiem.

Tabulā2 var būt vairāki ieraksti, kuri pēc A,B,C norāda uz vienu ierakstu iekš Tabula1

 

Tabula2
--------
A
B
C
DATI2

 

Vēl ir vairākas tabulas, kurās ir tādi pašas norādes ar A,B,C

Tas ir kā ir pašlaik.

Doma ir, ka varētu taisīt tā

Tabula1
--------
ID (primary key)
A
B
C
DATI

Tabula2
---------
T2_ID (norāda uz Tabula1 ID)
DATI

 

Tabulas1 A,B,C kombinācija unikāli raksturo ierakstu, tāpēc no tāda apsvēruma liktos, ka vajadzētu šīs trīs kolonnas kā primary keys, bet tai paša laika 1 primary key liekas efektīvāka.

 

Kurš no variantiem jūsuprāt būtu pareizāks vai labāks un kāpēc?

Edited by codez
Link to comment
Share on other sites

Nu turēt vienu integeru RAMā, protams, prasa mazāk atmiņas. Ja datu ir daudz, tad ir vērts pārtaisīt PK apr integeru. Sevišķi, ja vēl A,B,C ir kādi (var)chari. Mazāk aizkakāts key buffer/innodb pool. Ja datu nav daudz, domāju neatmaksājas pārtaisīt - kas labi strādā, lai strādā :D

Link to comment
Share on other sites

Nu turēt vienu integeru RAMā, protams, prasa mazāk atmiņas. Ja datu ir daudz, tad ir vērts pārtaisīt PK apr integeru. Sevišķi, ja vēl A,B,C ir kādi (var)chari. Mazāk aizkakāts key buffer/innodb pool. Ja datu nav daudz, domāju neatmaksājas pārtaisīt - kas labi strādā, lai strādā :D

Jā, A ir varchars, B,C INT

Bet ieraksti Tabulā1 ir daži miljoni, savukārt tabulā 2,3,4 vairāki desmiti miljoni.

Link to comment
Share on other sites

Pirmkārt tabulai nevar būt vairākas primārās atslēgas, bet tikai viena. Visas pārējās ir jāveido kā unikālās atslēgas. Attiecībā uz "pareizāks un labāks" nav vienota akmenī iecirsta veida tāpat kā vienam patīk māte, otram meita, trešajam kleita. Viss atkarīgs no kāda skatu punkta skatās, piemēram:

- ja raksta savienojumus (join) starp šādām tabulām, tad jo vairāk kolonas, jo savienojuma nosacījums kļūst neērtāks un lielākas iespējas ielaist kļūdas

- ja bērna tabulā ļoti bieži vajag dabūt vecāka tabulas kolonas A, B, C un citu neko nē, tad savukārt ir izdevīgi, jo tās kolonas jau ir iekšā bērna tabulā un nav jātaisa lieks savienojums izmantojot ģenerēto ID lauku.

- ja kādreiz pastāv iespēja, ka lauki A, B, C var mainīties, tad PK gadījumā no 3 kolonām, jārēķinās, ka tās būs jāmaina visur.

Īsāk sakot tas ir mūžīgais jautājums naturālās atslēgas vai surogātatslēgas (ģenerētās atslēgas). Īsumā, ja neskaita ļoti speciālus gadījumus, es balsoju par surogātatslēgām (tātad ģenerētiem id laukiem), bet esmu pārliecināts, ka ir cilvēki, kas domā pretēji :)

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

Dati jātlasa tā:

ir dots A,B,C

atlasam atbilstošo ierakstu Tabulā1

un visus atbilstošos ierakstus Tabulā 2,3,4, kuri norāda un šo ierakstu Tabulā1.

Index Tabulā1 uz A,B,C būs jāliek tā vai tā.

Taču izvēloties vēl likt ID, iegūst to, ka Tabulās 2,3,4 n-tās reizes neatkārtojas vētības A,B,C, bet tikai ID, kurš norāda uz atbilstošo ierakstu Tabulā1.

Un vēl arī tās references uz to ierakstu Tabulā1 iet caur klienta aplikāciju, respektīvi 1. gadījumā man jāsūta A,B,C kombinācijas, otrajā tikai ID.

 

Meklēju net-ā, bet īsti neviens nav aprakstījis labāko praksi un iespējamos akmeņus šādām situācijām.

Link to comment
Share on other sites

Ja taisīs vēl UNIQ/INDEX, tad no tā papildus ID nav jēgas. Ja būs jāatlasa dati pēc A; A,B vai A,B,C, tad tik definē PK un aizmirsti papildus ID priekš PK.

Nu es tā neteiktu. Tātad pirmkārt arī dabiskā veidā vienu objektu var unikāli identificēt vairākos veidos, piemēram, personu

1) pēc personas koda,

2) vārda, uzvārda, dzimšanas datuma un dzīvesvietas.

Tātad ja kādā sistēmā veidos personu tabulu ar ģenerētu id, tad UK uz personas kodu neveidos? Tad pastāv risks, ka kāds ieplēsīs divus tādus. Atceramies, ka ierobežojumiem un tiem atbilstošiem indeksiem ir 2 veidu funkcijas:

1) nodrošināt potenciāli labāku ātrdarbību

2) nodrošināt datu integritāti, piemēram, to, ka noteiktā(-s) kolonā(-s) dati ir unikāli. Un dažkārt var gadīties, ka šim gadījumam no ātrdarbības viedokļa nav jēgas, bet datu pareizības ir. Un tad lielajā vairumā gadījumu, tā ir svarīgāka.

Link to comment
Share on other sites

Cik garš, tas "A" (vidējais LENGTH(A)?)? Ieguvums, A aizvietojot ar INT, uz vairākiem 10milj ierakstu pa vairākām tabulām varētu būt vērā ņemams.

 

Edit:

Gints Plivna: jā, ja tas key velkās līdz pa vairākām tabulām, tad ir jēga.

 

P.S.

Personas kodu datubāzē nevar likt unikālu, kamēr tas dabā nav unikāls :D

Edited by marrtins
Link to comment
Share on other sites

Pašlaik izveidoju tā:

Tabula1

-------

ID

A

B

C

DATI

-------

primary_key(ID)

unique(A,B,C)

 

šķiet, ka tas būs man labākais risinājums, tikai uzreiz novēroju interesantu parādību.

 

Ja es insertoju kādu A,B,C kombināciju, tad ID piešķir sākumā 1. Tad, ja mēģinu to insertot 10x atkārtoti, man protams izmet "duplicate entry".

Tad mēģinot insertot citu unikālu A,B,C, ID jau tiek piešķirts 12. Respektīvi, katrs neveiksmīgais inserts arī palielināja autoincrement vērtību.

 

Mistiskā autoincrement palielināšana notiek pat, ja izmantoju INSERT ... ON DUPLICATE KEY UPDATE

Edited by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...