|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Fri Feb 15, 2008 11:45 pm Post subject: Saraksts datubāzē |
|
Datubāzē ir lietotāju tabula (katram ir savs ID). Ir vēl viena tabula kārtīm (kolekciju kārtis, var būt bezgalīgi daudz, katrai kārtij ir savs ID, viena kārts var piederēt vairākiem spēlētājiem). Katram spēlētājam ir sava kāršu kolekcija. Jautājums tāds: kā glabāt šo kolekciju datubāzē. Cik man zināms, tad MySQL nav nekāds saraksta tips, tāpēc es esmu spējīgs izdomāt 3 metodes:
1) Atsevišķa tabula, kurā glabā user_id un card_id. Problēmas rodas tad, kad ir jātaisa pieprasījums, kas atrod visas kārtis, kas pieder kādam spēlētājam, kvērijs sanāk ļoti ilgs.
2) Saglabāt user tabulā jaunu kolonnu: card_list, kas glabās visu kāršu ID atdalītu ar atstarpi. Problēma tāda, ja kārts ID iet tūkstošos, tad viena kārts aizņem 5 baitus (tūkstotis - 4 cipari + atstarpe).
3) Glabāt kā integeru, kurš ir vienāds ar 2^card1_id + 2^card2_id + ... + 2^cardn_id. Problēma tāda, ka ar šo metodi lietotājam nevar būt 2 vienādas kārtis.
Varbūt jums ir zināma kāda metode, kā glabāt sarakstus SQL'ā? _________________ long time; /* know C */ |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Fri Feb 15, 2008 11:50 pm Post subject: |
|
Ienāca prātā vēlviena metode. Katrai kārtij atvēlēt 2 baitus (65536 kombinācijas) stringā. Un pēc tam vienkārši no kolonnas ielasīt pa 2 baitiem un castot par integeru. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Fri Feb 15, 2008 11:51 pm Post subject: Re: Saraksts datubāzē |
|
elvman wrote: | 1) Atsevišķa tabula, kurā glabā user_id un card_id. Problēmas rodas tad, kad ir jātaisa pieprasījums, kas atrod visas kārtis, kas pieder kādam spēlētājam, kvērijs sanāk ļoti ilgs. |
Tikai un vienīgi šis variants ir pareizas un ņemamais!
Visas kārtis atrast var pēc kverija:
Code: | SELECT card_id FROM user_card_table WHERE user_id = 12312 |
vai arī joinojot kāršu tabulu:
Code: | SELECT card.* FROM card JOIN user_cards ON card.id = user_cards.card_id WHERE user_cards.user_id = 12312 |
Kverijam jāizpildās ir ļoti ātri, ja pareizi ir salikti indeksi - uz user_cards.user_id/card_id laukiem.
Palieto EXPLAIN komandu, tai vajadzētu pateikt tev hintus kāpēc kverijs ir lēns, un ko darīt lietas labā. |
|
Back to top |
|
|
spicausis
Joined: 23 Jan 2006 Posts: 85 Location: Teika
|
Posted: Sat Feb 16, 2008 12:07 am Post subject: Re: Saraksts datubāzē |
|
Pirmais variants ir vienīgais prātīgais, jā. Ar indeksu uz lietotāja id pieprasījums būs acumirkšķīgs. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sat Feb 16, 2008 12:17 am Post subject: |
|
Ok, paldies. _________________ long time; /* know C */ |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|