Autor Zpráva
Mesiah
Profil
Ahoj,

prosím Vás, mám problém. Mám komentáře, jednak k produktům a také k článkům. Rozhodl jsem se "házet do jednoho pytle", tím myslím do jedné tabulky comments - (id [int auto increment], name [varchar], text [text], date [datetime]) a rozhoduji který komentář patří k určitému článku pomocí tabulky comment-post - (id_comment [int index], id_post [int index]) a k určitému produktu pomocí tabulky comment-product - (id_comment, id_product).

Představte si situaci: vložím komentář u produktu id:15 ten se uloží do db do tabulky comments, jenže nevím jeho id a ani jak je zjiskat abych mohl do tabulky comment-product vlozit hodnoty (id_komentare, 15)...

Nemáte nějaké nápady?
Má myšlenka byla následující: komentář jako komentář, proč je separatně dělit? Dělit bych je měl jinde... (tabulky comment-post, comment-product)
Keeehi
Profil
buď mysql_insert_id() (PHP)
nebo LAST_INSERT_ID (MySQL)
Mar
Profil
ja si myslim, ze tahat posledni zaznam je blbost, co kdyz prijdou 2 dotazy zasebou, 1 se nezaregistruje

Ja bych to udelal nasledovne: Po odeslani formulare, bych vlozil do tabulky comment normalni zaznam, potom bych si z tabulky komment vytahl sloupec ID a zadal vsechny podminky, co se vyplnovaly do INSERTU tabulky, je to zdlouhave (a mozna narocne), ale me to funguje, taky to neni idealni, ale zabranis tomu alespon trochu, ma nekdo lepsi napad?
Mesiah
Profil
Keeehi:
Pro LAST INSERT ID bych musel zarucit atomicitu operaci: vlozit, ziskat, to by sam o sobe takovy problem asi nebyl, ale predstav si situaci, ze nekdo vlozi komentar, ktery se nejak zasekne a po dobu nez se to zahodi, nebo vyridi by nikdo nemohl zapsat zadny komentar (v tom lepsim pripade) a pokud bych pouzil mysql_insert_id pak bych v tom lepsim pripade jen narusil autoincrement... Ale dekuji za reakci...

Mar: tomu jsem se chtel vyhnout...


a muj napad, co me napadl ve vlaku:
do tabulku comments pridam unikatni sloupec hash, tan bude vypocitany z (datetime_vlozeni + login + nahodne_cislo(1..1000)) a v tabulky comment-post a comment-product upravim na tvar:
(hash_comment [Varchar index], id_post(product) [int index]) tim bych mel tak nejak zajistil, ze ikdyby ve stejnem case zapsali dva lide komentar se stejnym jmenem budou ruzna hash a pokud nastane konflukt budu generovat, dokud nenajdu takove, ktere bude platne...
Keeehi
Profil
Mesiah:
Pak to můžeš udělat opačně. Žádný autoincrement, ale nejdříve select max(id) a pak insert žjištěné_id+1.
TomášK
Profil
Keeehi:
To taky není dobré řešení. V případě paralelního zpracování se může provést
1: zjistí id
2: zjistí id
1: zapíše
2: přepíše


mysql_insert_id()/LAST_INSERT_ID je unikátní v nějakém kontektu (myslím, pro každé připojení k databázi). Nevidím důvod, proč by se to mělo zaseknout při špatně vloženém komentáři ("auto increment" se narušit asi může).

Sám v podobných případech používám trochu jiný model:
product(id)
post(id)
comment(commentable_id, commentable_type) // např. (1, "Product"), (1, "Post") atd.

Pokud bys chtěl komentoval dalších pět věcí, nemusíš v tomto modelu vytvářet dalších pět vazebních tabulek.
Keeehi
Profil
TomášK:
Přepsání se neprovede. To by tam musel být update místo insert. Jedině by to vložilo 2x se stejným id. Jelikož předpokládám, že na sloupci bude buď index nebo alespoň unique, tak by to 2. vložení skončilo chybou. Stačí po vložení zkontrolovat, zda nenastala chyba a pokud ano, vložení opakovat.
1: zjistí id
2: zjistí id
3: zapíše
4: pokusí se o zápis, ale skončí to chybou
5:znovu zjistí id (nebo se pokusí s id+1)
6: zapíše
TomášK
Profil
Keeehi:
Máš pravdu, nedomyslel jsem to. Ale nic to nemění můj názor na to, že je to nešikovný přístup. Pokud se ukáže, že nefunguje LAST_INSERT_ID(), našel/vytvořil bych si generátor unikátních id a používal ho místo AUTO_INCREMENT.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0