dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Saraksts datubāzē

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
spicausis



Joined: 23 Jan 2006
Posts: 85
Location: Teika

PostPosted: 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
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: Sat Feb 16, 2008 12:17 am    Post subject:

Ok, paldies.
_________________
long time; /* know C */
Back to top
View user's profile Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
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