ID-uri de baze de date prestabilite; sistem și valorile utilizatorilor

Ca parte a activității noastre actuale de baze de date, ne uităm la o abordare a procesului de actualizare a bazelor de date.

Un punct care a fost reluat în mod repetat este acela de a trata valorile sistemului față de utilizatori; în proiectul nostru, utilizatorii și sistemele vals sunt stocate împreună. De exemplu...

Avem o listă de șabloane.

1, 

2, 

3, 

Acestea sunt mapate în aplicație într-un enum (1, 2, 3)

Apoi, un utilizator intră și adaugă ...

4, 

...și...

5, 

Apoi .. emitem un upgrade .. și inserați ca parte a scripturilor noastre de upgrade ...

 [6], 

THEN !! ... găsim o eroare în noul șablon de sistem și trebuie să îl actualizăm ... Problema este cum? Nu putem actualiza înregistrarea folosind ID6 (așa cum am introdus-o ca 9 sau 999, deci trebuie să identificăm înregistrarea folosind un alt mecanism)

Deci, am ajuns la două soluții posibile pentru acest lucru.

În colțul roșu (viteză) ....

Pur și simplu pornim ID-urile de utilizator la 5000 (sau altă valoare) și datele de testare la 10000 (sau altă valoare). Acest lucru ne-ar permite să facem modificări ale valorilor sistemului și să le testam până la limita inferioară a intervalului de identificare următor.

Avantaj ... Rapid și ușor de implementat,

Dezavantaj ... ar putea să scapi de valori dacă nu alegem un interval suficient de mare!

În colțul albastru (scalabilitate) ...

Stocăm separat datele de sistem și de utilizator, folosim GUID-urile ca ID-uri și fuzionăm cele două liste folosind o vizualizare.

Avantaj ... Scalabil .. Nu limite w/vedere la dimensiunea DB.

Dezavantaj .. Mai complicat de implementat. (multe viziuni care pot fi actualizate etc.)


M-am îmbinat în mod corespunzător pentru prima opțiune, dar căutând niște muniții pentru a mă susține!

Are cineva vreun gand despre aceste abordari, sau chiar unul (e) pe care le-am pierdut?

0
fr hi bn

6 răspunsuri

+1 pentru ID-ul bazat pe text al lui Biri - definiți o coloană bazată pe text "template_mnemonic" și faceți-o drept cheie primară. Aceasta va fi o valoare cunoscută atunci când o inserați ca și dvs., dezvoltatorii o vor decide (sau o vor genera automat) și veți putea întotdeauna să trimiteți un șablon prin mnemonicul său, indiferent de câte șabloane specificate de utilizator există. De asemenea, permite utilizatorilor să aibă o convenție de numire semnificativă pentru șabloanele lor.

0
adăugat

I have never had problems (performance or development - TDD & unit testing included) using GUIDs as the ID for my databases, and I've worked on some pretty big ones. Have a look here, here and here if you want to find out more about using GUIDs (and the potential GOTCHAS involved) as your primary keys - but I can't recommend it highly enough since moving data around safely and DB synchronisation becomes as easy as brushing your teeth in the morning :-)

Pentru întrebarea de mai sus, aș recomanda fie oa treia coloană (dacă este posibil) care indică dacă șablonul este sau nu bazat pe utilizator sau pe sistem, sau puteți genera cel puțin GUID-uri pentru șabloane de sistem pe măsură ce le inserați și păstrați o listă de cei aflați la dispoziție, astfel încât, dacă aveți nevoie să actualizați șablonul, puteți viza același GUID în bazele de date DEV, UAT și/sau PRODUCTION, fără teama de a suprascrie alte șabloane. Cea de-a treia coloană ar fi utilă pentru selectarea oricăror șabloane de sistem sau de utilizator, fără a fi nevoie să le separați în două tabele (aceasta este o depășire IMHO).

Sper ca te ajuta,

Rob G

0
adăugat

Vă recomandăm să utilizați al doilea cu modificarea în care stocați valorile sistemului și ale utilizatorilor într-un singur tabel. GUID este destul de fiabil în acest mod.

O altă idee: utilizați orice ID pe bază de text (nu este necesar GUID), pe care îl dați pentru valorile sistemului și este generat de un șir aleator sau de un șir bazat pe un anumit tip de logică personalizată pentru valorile utilizatorilor.

O altă idee: folosiți prima abordare, dar extindeți tabelul cu un steag care arată dacă o valoare este sistem sau utilizator. Poate că acesta este cel mai ușor. Ok, trebuie să scrieți un fel de mecanism pentru a actualiza valoarea corectă a sistemului, dar se poate face ușor.

0
adăugat

Nu cred că GUID ar trebui să facă vreo problemă.

Dacă doriți să o evitați, utilizați un steag:

ID int

     

șablon orice

     

flag enum/int/bool

Marcajul arată dacă valoarea reală este un sistem sau o valoare a utilizatorului.

Dacă doriți să actualizați o valoare a sistemului, atunci cereți numai valori de sistem ordonate după ID, și vă va arăta ordinea de inserare reală (ar trebui să aveți o bigint sau ceva pentru ID pentru a vă asigura că nu este complet și nu primește ID-urile șterse la serviciu). Cu această listă x. înregistrarea este x. valoarea introdusă a sistemului.

0
adăugat

Cred că există o soluție terță mai bună. Mă lovește că stocați două lucruri diferite în aceeași masă și că ar fi mai bine să creați 2 tabele separate unul pentru șabloane de utilizator și unul pentru șabloane de sistem. Apoi, puteți crea o vedere asupra celor două tabele pentru a le face să apară ca un singur obiect pentru aplicația dvs. Evident că nu am o cunoaștere completă a aplicației dvs. și acest lucru poate fi imposibil pentru dvs. din mai multe motive, dar cred că este o soluție mai bună decât GUID-urile și mai sigur decât intervalele de ID-uri te muste o zi)

0
adăugat

Poate că nu am reușit, dar nu ați putea utiliza GUID-urile ca ID-uri și încă aveți date de utilizator și de sistem împreună? Apoi puteți accesa datele de sistem prin GUID-urile (non-schimbabile).

0
adăugat