Autor Zpráva
martin b.
Profil *
Ahoj,

mám jen takovou otázku. V rezervačním systému, který právě programuji je možné do objednávky zahrnout nějaké položky. Jenže ty položky může administrátor změnit a já chci, aby klient viděl to, jaké položky si tam přidal, položky mají i cenu.

Takže zákazník si objedná:

P1 - 1120 Kč
P2 - 2230 Kč

Pak administrátor změní ceny, třeba na

P1 - 1020 Kč
P2 - 2130 Kč

A pokud bych k objednávce dával id té položky co změnil, zákazník by viděl už nové ceny a né ty, které si objednal. Takhle administrátor může změnit i název nebo cokoli jiného, co k položce patří (nemá jen název a cenu). Tak bych se rád zeptal, jak takovou situaci řešit?

Momentálně to dělám tak, že mám jinou tabulku, kam vlastně kopíruji to, co si objednal, problém je ale ten, že potřebuji i to id na ten originál, ale ten zas admin může změnit..

Nějaký nápad? Děkuju
Kajman_
Profil *
Změnu id můžete hlídat triggerem a v druhé tabulce s původními hodnotami aktualizovat.
martin b.
Profil *
Kajman:
Děkuju za odpověď, ale teď tomu moc nerozumím. Proč bych měl hlídat změnu id? To id se nemění, mění se jen ty hodnoty pod tím id.
Kajman_
Profil *
Administrátor mění i hodnoty v druhé záložní tabulce? Nebo může v aktuální měnit id, tak by se ze záložní špatně provazovalo na aktuální?
martin b.
Profil *
Asi jsem to nesrozumitelně popsal. Tak snad lépe:

Dvě tabulky, nazvu je "originál" a "kopie". V té "originál" může administrátor měnit cokoli, kromě id. A já chci uživatelovi, který si zvolí nějaké položky umožnit vidět v budoucnu to, co si zvolil - tedy uvidí u položek cenu, za kterou je kupoval. Ale administrátor může u položek třeba změnit cenu položek.

Takže pokud bych měl pouze tabulku "originál", zákazník by viděl vždy nové údaje, neviděl by ty původní, které měl při objednávce.

Pokud budu mít i tabulku "kopie", potřebuju ale zase referenci na původní - originální položku. Jednoduše jsem to vyřešil tak, že jsem do tabulky "kopie" dal sloupec s id odkazující na originál...

Někdo mi radil, ať mám jen jednu tabulku - "originál" a pokud admin něco změní, původní záznam zachovám a zneviditelním a vytvořím nový. Ale zdá se mi zbytečné mít v tabulce "originál" prakticky jen duplicitní data, pokud by třeba změnil jen překlep. A hlavně, pokud záznam obsahuje poměrně delší popis...

Tak by mě zajímalo, jak se takový problém normálně řeší...?
Kajman_
Profil *
Myslím, že jsou obě varianty ukládání možné. Osobně bych asi také ukládal do dvou tabulek - hlavně pokud se skoro vždy používá tabulka originál a tabulka kopie jen výjimečně. A kór když to máte už naprogramované takto, bych to do jedné tabulky necpal :-)

Nejřív jsem myslel, že Vás trápí, že administrátor může změnit id v tabulce originál a přeruší tak vazbu, proto jsem odkazoval na použití triggeru.
imploder
Profil
Taky by se to dalo řešit tak, že pokud má položku někdo objednanou, tak nejde změnit a při změně se místo toho vytvoří nová položka s jiným ID. Takže původní ID pořád odkazuje na tu starou, s původní cenou.

ON UPDATE RESTRICT, viz http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

EDIT:
Původní položka by se musela nějak zneviditelnit. asi to není úplně nejlepší řešení, protože kdo odkaz na starou položku v katalogu by pak nefungoval. Co třeba to vyřešit úplně jednoduše, že v okamžiku, kdy si zákazník položku objedná, se všechny potřebné údaje nakopírují do objednávky a tam zůstanou napořád nezměněné? Prostě že by údaje, co zákazník uvidí, byly jen kopie a změna položky, ze které vznikly, je nijak neovlivní. To mi připadá nejjednodušší a nejlepší.
No ale to už tady zaznělo, takže vlastně tohle píšu zbytečně.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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