Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQL] Unikalna wartość inaczej, (int) 1 moze wystapic tylko raz a reszta może się powtarzać
kiler129
post
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Witajcie!
Idea jest prosta, mam tabelę grup wyglądającą tak:
(IMG:http://wstaw.org/m/2011/03/17/Screen_shot_2011-03-17_at_21.31.38.png)

Jak pewnie każdy się domyśla pole isDef gdy jest równe 1 mówi skryptowi, że dana kategoria jest domyślną. Problem jest taki, że użytkownicy to kombinatorzy i nawet jak zabezpieczam to od kodu ktoś może grzebać w sqlu (lub któryś plugin).
Chciałbym od strony sqla zabezpieczyć to tak, aby "1" nie mogło wystąpić więcej niż raz. Zwykłe unique tu nie zadziała bo zera przecież mogą się powtarzać.
Go to the top of the page
+Quote Post
cudny
post
Post #2





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

Ostrzeżenie: (0%)
-----


Cytat(kiler129 @ 17.03.2011, 21:34:22 ) *
Problem jest taki, że użytkownicy to kombinatorzy i nawet jak zabezpieczam to od kodu ktoś może grzebać w sqlu (lub któryś plugin).


Co ?!?
Jeśli ktoś może coś zmienić bez uprawnień lub cokolwiek robić co nie zostało zaplanowane w aplikacji to jest to potężna! luka w zabezpieczeniach (IMG:style_emoticons/default/exclamation.gif) !
Nawet nie pisz takich rzeczy (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Eby
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 16.10.2007

Ostrzeżenie: (0%)
-----


Nie ma zabezpieczeń nie do przejścia. Jeśli zakładasz, że użytkownicy będą grzebać w skryptach lub SQLu, to każde zabezpieczenie które założysz na SQLa (np. uniq o którym pisałeś - jeśli by działało; lub triggery), może zostać przez "osobę grzebiącą" ściągnięte (ominięte).
Go to the top of the page
+Quote Post
kiler129
post
Post #4





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Luk staram sie aby nie było (IMG:style_emoticons/default/wink.gif)
Generalnie z tym sqlem chodziło mi raczej o jakiegoś grzebule od phpmyadmina albo zwyczajnego buta w kodzie (IMG:style_emoticons/default/wink.gif)

Wpadł mi ciekawy pomysł do głowy który pilnować nie będzie ale zniesione skutki: przy edycji dowolnej kategorii robię dodatkowo select po isDef z limit 1, zapamietuje od grupy, robię update isDef na 0 i następnie kolejny update tyle ze ustawiam isDef na 1 tylko zapamietanemu idkowi.
Metoda może trochę na około ale nie znalazłem żadnego mechanizmu w mysqlu służącego do tego celu (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
mat-bi
post
Post #5





Grupa: Zarejestrowani
Postów: 690
Pomógł: 92
Dołączył: 6.02.2011

Ostrzeżenie: (0%)
-----


1. triggery(ale o szczegóły mnie nie pytaj (IMG:style_emoticons/default/wink.gif) )
2. w php dajesz podstawowe zapytanie
  1. SELECT * FROM tabela WHERE isDef='1'


Potem tylko sprawdzasz przez zwykły if, czy zapytanie zwróciło wyniki i reagujesz na sytuację
Go to the top of the page
+Quote Post
kiler129
post
Post #6





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Obecnie isDef używam tylko do dodawania napisu "Domyslna" ale chce dopisać zabezpieczenia typu nieusuwalnosc domyslnej czy przenoszenie userow ze skasowanej do domyslnej wiec fajnie żeby była unikalną (IMG:style_emoticons/default/wink.gif)
Twój sposób nie zadziała bo ja potrzebuje mieć porządek w sql a nie tylko w tym co dostanie user. A o triggerach pogooglam (domyślam sie ze chodzi tu o ustawienie watchdoga który pilnuje danych)
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Normalnie użyłbyś CHECK(), ale MySQL tego nie obsługuje. Dosyć łatwo możesz to osiągnąć poprzez kombinację ENUMa i NULLa, tj:
  1. is_def ENUM('yes') DEFAULT NULL,
  2. UNIQUE KEY(is_def)
NULLe traktujesz jako "nie", YES traktujesz jako "tak". Takie coś umożliwia nieistnienie żadnej domyślnej grupy, ale gwarantuje tylko jedną domyślną.

PS. W MySQL (właściwie to ogólnie w SQL) stosuje się konwencję "underscore", czyli is_def, nie isDef.
Go to the top of the page
+Quote Post
kiler129
post
Post #8





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 18.03.2011, 23:20:09 ) *
Normalnie użyłbyś CHECK(), ale MySQL tego nie obsługuje. Dosyć łatwo możesz to osiągnąć poprzez kombinację ENUMa i NULLa, tj:
  1. is_def ENUM('yes') DEFAULT NULL,
  2. UNIQUE KEY(is_def)
NULLe traktujesz jako "nie", YES traktujesz jako "tak". Takie coś umożliwia nieistnienie żadnej domyślnej grupy, ale gwarantuje tylko jedną domyślną.

PS. W MySQL (właściwie to ogólnie w SQL) stosuje się konwencję "underscore", czyli is_def, nie isDef.



Hmm sprytne, dopilnowanie tego aby zawsze była domyślna tu już nie taki duży problem (IMG:style_emoticons/default/smile.gif)

Co do notacji - wszystkie underscory przeprawiłem na notację somethingNice bo w każdym kodzie tak pisze więc po co w bazie danych kombinować (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. Nie cytuj całych wypowiedzi, a już w szczególności, gdy odpowiadasz na ostatni post.
2.
Cytat
Co do notacji - wszystkie underscory przeprawiłem na notację somethingNice bo w każdym kodzie tak pisze więc po co w bazie danych kombinować (IMG:style_emoticons/default/smile.gif)
Bo właśnie to Ty kombinujesz. (IMG:style_emoticons/default/wink.gif) Kod pisze się zawsze z uwzględnieniem konwencji dla danego języka i tak w takim PHP czy Javie zmienne nazywasz stosując konwencję camel case (nazwaZmiennej), a w takim C czy SQLu zmienne / kolumny nazywasz stosując konwencję underscore (nazwa_zmiennej). Inaczej prędzej czy później doprowadzisz do burdelu w kodzie.
Go to the top of the page
+Quote Post
kiler129
post
Post #10





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Tak ale skoro stosuje CC w kodzie to dlaczego mam go nie używać w SQLu? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Powtórzę:
Cytat
Kod pisze się zawsze z uwzględnieniem konwencji dla danego języka [...]
A SQL ma utartą konwencję nazewnictwa, gdzie słowa kluczowe pisze się wielkimi literami, a identyfikatory zapisuje w_ten_sposób.
Go to the top of the page
+Quote Post
kiler129
post
Post #12





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 19.03.2011, 01:32:52 ) *
Powtórzę:A SQL ma utartą konwencję nazewnictwa, gdzie słowa kluczowe pisze się wielkimi literami, a identyfikatory zapisuje w_ten_sposób.


No to w takim razie w php też_należy_pisać_tak patrząc na stdlib co nie zmienia faktu, że każdy pisze jak chce klamry oraz nazwy kluczowe.
Ważne jest w sumie nie tyle forma zapisu co jego czytelność i spójność - idąc tym tropem wg. mnie powinno się pisać w całym projekcie w jeden sposób (baza danych jest częścią projektu, right?).
Kolejna sprawa - nie nazwałbym SQLa językiem - formalnie się do nich zalicza ale nie pisze się w nim jako takich funkcji, pętli, przekształceń (a bynajmniej nie powinno się - jest to możliwe ale wciąż trzeba pamiętać, że to BAZA danych a nie PREPROCESOR danych).

Ten post edytował kiler129 19.03.2011, 02:02:57
Go to the top of the page
+Quote Post
Crozin
post
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


PHP w to nie wciągaj. PHP to książkowy przykład burdelu spowodowanego tym, że każdy robił jak chciał. Pomijamy fakt, że obecnie PHP jest w fazie przejściowej, tj. cały nowy kod powinien być pisany wg notacji camelCase.
Cytat
idąc tym tropem wg. mnie powinno się pisać w całym projekcie w jeden sposób (baza danych jest częścią projektu, right?).
Kod PHP pisze się inaczej, kod CSS pisze się inaczej, kod XML pisze się inaczej, kod YAML pisze się inaczej, kod SQL pisze się inaczej, kod Javy pisze się inaczej, kod Basha pisze się inaczej - wszystkie pisze się inaczej mimo iż nie ma najmniejszego problemu by wystąpiły wszystkie w jednym projekcie.
Cytat
Kolejna sprawa - nie nazwałbym SQLa językiem - formalnie się do nich zalicza ale nie pisze się w nim jako takich funkcji, pętli, przekształceń (a bynajmniej nie powinno się - jest to możliwe ale wciąż trzeba pamiętać, że to BAZA danych a nie PREPROCESOR danych).
Język SQL jest pełnoprawnym deklaratywnym językiem programowania w którym występują przekształcenia, pętle czy funkcje (no, te ostatnie to raczej zaliczają się do rozszerzeń SQLa, ale ogólnie przyjmuje się to wszystko za jedność). Nie wiem też co tutaj mają preprocesory do rzeczy.

W skrócie: nie rób burdelu i dostosuj się do ogólnie przyjętych konwencji.
Go to the top of the page
+Quote Post
kiler129
post
Post #14





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Faktycznie skończymy już temat cc/us - do niczego nie dojdziemy (IMG:style_emoticons/default/wink.gif)
Jeśli chodzi o język SQL to nie odpuszcze swojej racji - owszem, można w nim pisać pełnoprawny kod ale nie do tego on służy! Od przetwarzania danych mamy stronę aplikacji a nie bazę danych.
Dużo lepszym wyjściem jest pobranie w prostrzy sposób nawet nieco większej porcji danych i przetworzenie jej po stronie PHP niż pisanie zapytania które na zwrócenie wyniku potrzebuje kilku sekund.
Baza służy do gromadzenia i zwracania danych a nie do obróbki danych - tyle w temacie.
Go to the top of the page
+Quote Post
Crozin
post
Post #15





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@kiler129: W tej chwili skompromitowałeś się. Celem istnienia baz danych jest... gromadzenie i przetwarzanie danych. Zadaniem aplikacji jest przetwarzanie tylko tego czego z poziomu bazy danych się nie da, albo jest to efektywniejsze. Chociażby dla zachowania spójności danych czy pisania kodu raz i wykorzystywania go wielokrotnie (w przypadku gdy kilka aplikacji korzysta z jednej bazy). To, że Ty się ograniczasz do operacji CRUD na bazie danych to tylko i wyłącznie Twoja sprawa, ale nie wypisuj głupot, że bazy służą wyłącznie do tego.
Cytat
[...] niż pisanie zapytania które na zwrócenie wyniku potrzebuje kilku sekund.
Tak, bo PHP przetworzy te dane w jedną tysięczną sekundy...
Cytat
Baza służy do gromadzenia i zwracania danych a nie do obróbki danych - tyle w temacie.
Do poczytania: http://en.wikipedia.org/wiki/PLSQL (i inne warianty innych baz danych).
Go to the top of the page
+Quote Post
everth
post
Post #16





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


A to PLSQL jest częścią standardu SQL? Bo czysty SQL chyba jednak nie jest pełnoprawnym językiem programowania.
Go to the top of the page
+Quote Post
Crozin
post
Post #17





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


@everth:
Cytat
Język SQL jest pełnoprawnym deklaratywnym językiem programowania w którym występują przekształcenia, pętle czy funkcje (no, te ostatnie to raczej zaliczają się do rozszerzeń SQLa, ale ogólnie przyjmuje się to wszystko za jedność).
Go to the top of the page
+Quote Post
everth
post
Post #18





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


No i masz rację, rację ma też @kiler129, wszystko zależy od tego co wpiszecie sobie pod skrót SQL (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
kiler129
post
Post #19





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


Ja to ujmę inaczej - można ale żadko wydajniej jest przetwarzać coś na bazie danych niż w aplikacji. Szczególnie ta zasada ma się do PHP gdzie kod jest odpalany w większości na shared-hostach gdzie bazy są bardzo obciążone.
Go to the top of the page
+Quote Post
Crozin
post
Post #20





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat
Ja to ujmę inaczej - można ale żadko wydajniej jest przetwarzać coś na bazie danych niż w aplikacji.
Chciałeś chyba powiedzieć coś dokładnie odwrotnego?
1. Transport danych z bazy do aplikacji jest dosyć kosztowny.
2. PHP samo w sobie będzie raczej minimalnie wolniejsze od bazy danych (mimo iż testów nie przeprowadzałem).

Cytat
Szczególnie ta zasada ma się do PHP gdzie kod jest odpalany w większości na shared-hostach gdzie bazy są bardzo obciążone.
Tak, tylko w przypadku aplikacji odpalanych na współdzielonych maszynach ten aspekt wydajności jest kompletnie bez znaczenia.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 15:44