 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
johnutz
Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură
|
| Trimis: Sâm Feb 11, 2006 9:47 am Titlul subiectului: restrictii si validari facute de baza de date, nu din cod |
|
|
Am si eu niste intrebari care mi s-au adunat de-a lungul timpului:
1. Oare e mai bine ca atunci cand vreau ca intr-o coloana de tabel sa am valori unice, sa pun pe coloana respectiva un INDEX UNIQUE si, la insert, sa ma bazez pe eroarea pe care mi-o da MySQL?
2. Poate MySQL sa dea vreo eroare, ceva, daca, de exemplu, vreau sa introduc intr-un camp VARCHAR(20) un text mai lung? Sau intr-un camp ENUM sau SET sa pun alte valori decat cele predefinite?
3. In cazul tabelelor relationate, daca le pun ADD CONSTRAINT, scap de nevoia de a mai scrie niste cod.. Ce dezavantaje are metoda asta?
4. Mai sunt si alte lucruri asemanatoare care pot fi facute din baza de date? Pe alte SGBD-uri decat MySQL cum merge?
5. Exista vreun framework / DB abstraction care sa suporte (sa puna in valoare) ce am zis eu mai sus? (Eu cred ca da, dar sa fiu sigur..)
6. Cred ca nu sunt primul care are idei din astea.. Ceva articole, tutoriale? |
|
| Sus |
|
strategy
Data înscrierii: 19/Noi/2004
Mesaje: 351
Locație: Oradea
|
| Trimis: Sâm Feb 11, 2006 10:44 am Titlul subiectului: |
|
|
1. is destul de bine tratate erorile in MySQL. io le prefer pe ele si ii mai safe.
2. intr-un varchar(20) la un INSERT mai mult de 20chr iti va taia cei in plus fara sa dea eroare.
3. nu stiu
4. MSSQL merge struna.
5. nu stiu, nu m-am interesat niciodata :) |
|
| Sus |
|
ExcalIbvr
Data înscrierii: 02/Mai/2004
Mesaje: 1107
Locație: Oradea
|
| Trimis: Sâm Feb 11, 2006 11:02 am Titlul subiectului: |
|
|
Dar care este, de fapt, diferenta? Pentru ca validare oricum faci. Nu cred ca e foarte optim sa te bazezi pe SGBD pentru validare.
Ce te faci daca ai un INSERT intr-un tabel cu 20 de campuri si primesti un mesaj de eroare ca interogarea nu a putut fi executata? Cum localizezi eroarea? Pe cand daca iti definesti niste reguli clare pentru fiecare camp in parte, e usor sa faci debugging.
Sa vezi validarea in Rails cum se face! Jenibil de simplu: :lol:
Cod: class User < ActiveRecord::Base
validates_presence_of :username
validates_length_of :username, :within => 4..16
validates_uniqueness_of :username, :message => "already exists"
end
Pentru cei care nu sunt familiari cu Rails, treaba asta face urmatoarele:
- defineste clasa User, care prin componenta ActiveRecord se leaga de tabelul "users" din baza de date.
- in formularele de adaugare/modificare, definesc 3 reguli de validare:
1. campul "username" (care exista si in baza de date, evident) nu trebuie sa fie nul.
2. lungimea textului introdus in acel camp trebuie sa fie intre 4-16 caractere.
3. valoarea din camp trebuie sa fie unica (aceasta regula verifica in baza de date).
Revenind...
In arhitectura MVC, baza de date reprezinta, de cele mai multe ori, modelul. Validarea datelor tine de controller si e bine sa ramana acolo. |
|
| Sus |
|
aurelian
Data înscrierii: 01/Iun/2003
Mesaje: 833
Locație: Bucuresti
|
| Trimis: Sâm Feb 11, 2006 2:53 pm Titlul subiectului: |
|
|
ExcalIbvr a scris:
[...]
Revenind...
In arhitectura MVC, baza de date reprezinta, de cele mai multe ori, modelul. Validarea datelor tine de controller si e bine sa ramana acolo.
vezi ca in Rails, si se vede si din exemplu tau, validarea se face in Model :)
oricum, la intrebarile lui johnutz:
1: DA
2: NU, iar in cazul ENUM, cred ca iti da eroare daca incerci sa introduci o alta valoare.
3: Nici un dejavantaj.
Totusi, ca o paranteza, adaugare de ADD CONSTRAINT (caz intrebarea 3) si/sau UNIQUE (caz intrebarea 1) si/sau campuri ENUM (intrebarea 2) iti va facea viata dificila in momentul in care vrei sa faci modificari in aplicatie.
Eg: sa adaugi o noua valoare in ENUM, trebuie sa faci manual un ALTER TABLE (probabil).
La fel daca constati ca nu mai vrei index unque iar adaugarea unei noi table (pentru relationare) nu e cea mai buna solutie in cazul dat.
4: probabil ca proceduri, viewuri (disponibile si in mysql 5) insa nu le folosesc in mod curent.
Poti experimenta cu FIREBIRD (open-source, suport ptr. php, poate fi embaded - gen sqlite, ofera cele mai multe features pentru un SGDB free).
5: probabil o fi, eu folosesc creole
6: umm, google :)
Deci, marea problema ramane modificarea aplicatie in viitor, iar prin folosirea indicilor unici, campurilor ENUM sau SET sau constrain-uri ingradesti mult dorita extensibilite.
Tot la rails, oamenii astia prefera sa nu introduca asemenea concepte direct in engineul sql, ei refera sa scrie cod in ruby pentru a face asocieri intre tabele sau validari ale datelor. |
|
| Sus |
|
ExcalIbvr
Data înscrierii: 02/Mai/2004
Mesaje: 1107
Locație: Oradea
|
| Trimis: Sâm Feb 11, 2006 3:04 pm Titlul subiectului: |
|
|
#-o (pacat ca nu stie phpbb emoticonu' asta)
yup, ai dreptate aurelian, ramasesem fixat pe o chestie. :) |
|
| Sus |
|
PHPRomania Bot
Bot Member
Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google |
| Trimis: Mie Dec 26, 2007 7:01 pm Titlul subiectului: Ad |
|
|
|
|
|
| Sus |
|
| |
|