logi sisse meist KKK

Tööl tekkis vaidlus kuidas oleks õige teha. Vaidluse all on konstantide väärtused, kas õige on panna numbrid 1, 2, 3 jne või näiteks kui on tegu mingi objekti staatusega siis kas tuleks kasutada stringe "ACTIVE", "CLOSED" jne?

Taustinfona, et need konstandid salvestatakse baasi. Ühe poole argument on "see on cargo cult, nii teevad C progejad. baasist on ilusam vaadata ja arusaadamav kirjutada päringuid, select * from tabel where status = 'ACTIVE'".

Teise poole argumendid "Nii on alati tehtud, miks mitte kasutada numbreid, nii on kiiremad päringud".

Mis teie arvate?

küsitud Oct 26 '12 at 13:12

skel's gravatar image

skel
68223


Enamus keeltes ja andmebaasides on selleks eraldi deklaratsioon enum. Andmebaasis kasutatakse küll numbreid aga queryd saab teksti kujul kirja panna. Võib MySQL või Postgre dokumentatsioonist rohkem lugeda.

Loomulikult enum-i kasutamisel võib kindlates situatsioonides probleeme olla.

Ma ei ole veendunud, et INT-idega on päringud kiiremad... täpsemalt, nad võivad kiiremad olla, aga see erinevus ei ole nii oluline. Enamus andmebaase oskavad üsna hästi oma päringuid optimiseerida.

Stringi kasutamine võib probleeme tekitada suur-väike tähtedega. Näiteks select * from table where status='active' ei pruugi anda samu tulemusi. Enumiga saad veateate kui vale väärtust kasutad.

Loomulikult see, et päringud ei ole loetav saab ära parandada, näiteks kui sul on need staatused eraldi deklareeritud, siis: statement("select * from table where status = ?", ACTIVE), on üsnagi loetav, ning see ACTIVE konstant võib olla nii int kui string.

Ehk minu soovitus, kasuta ENUM-i.

link

vastatud Oct 26 '12 at 13:53

egon's gravatar image

egon ♦♦
771239

Ma veel mõtlesin kas acceptida või mitte, sest meil on tegu keelega kus pole enumeid. Ruby ja Ruby on Rails nimelt.

(Oct 26 '12 at 15:22) skel

RoR-iga selles osas kogemus puudub, aga võib-olla sobib see http://stackoverflow.com/questions/2972618/enumeration-in-ruby-on-rails lahendus ja lisaks http://enum-column.rubyforge.org/

(Oct 26 '12 at 17:11) egon ♦♦

Kõige lihtsam, jätan koodi nii nagu on, Mudeli sees on konstandid STATUS_ACTIVE, STATUS_CLOSED jne, eraldi enumit sellise asja jaoks ehitama ei hakka, kui saab ka ilma.

(Nov 06 '12 at 12:10) skel

Oluliselt informatiivsem ja paindlikum oli minu praktikas üks lahendus, kus staatuse asemel olid ajatempli väljad (ehk timestamp; selles lahenduses umbes 5-6). Kui objektiga sai midagi tehtud, siis täideti vastav väli ära ja päringud olid stiilis "where toiming_a is not null and toiming_b is null".

Väga tihti juhtub staatustega seda, et läheb segaseks kätte (mingid erisused, kus ühed-teised toimingud jäävadki vahele ja siis tekivad sub-sub-sub staatused). Ajatemplitega on selgem, loetavam ja paindlikum (kirjutada on küll rohkem, jah). Ja lisaks on super hea ülevaade, millal sündmus aset leidis.

link

vastatud Oct 27 '12 at 00:49

Kaiko%20Kaur's gravatar image

Kaiko Kaur
2307711

See ei ole eriti hea lahendus, sest tegu on siiski staatustega, mida võib olla 5-6-7 erinevat. Igaühe jaoks mingit timestampi lisada oleks kehv.

(Nov 06 '12 at 12:07) skel

Vastus on täienduseks @egon vastusele, kuna ei saa kommentaari lisada.

Andmebaasis ma ei kasutaks stringe. Oli probleem, et päring ei tahtnud kuidagi stringi välja indeksit kasutada. Põhjuseks oli erinev charset.

Rubys on olemas Sümbolid

link

vastatud Oct 29 '12 at 11:57

Imre%20L's gravatar image

Imre L
1

Ma arvan et numbrid on mõtekas kasutada kui on rohkem kui 1 võimalik valik, ning kui on vaja pärast ka neid järjekorda panna. Mulle tundub et erilist vahet pole arusaamisel kas on status=0|1 või status=CLOSED|ACTIVE Üldjuhul kasutajale seda otse nagunii ei näidata. Samas sel puhul on timestamp mõistlikum variant, lisaks statusele omab ka ajainfot. Kui on väga palju konstante ja need võivad ajas muuta siis on mõistlik aretada mingi klassifikaatorite tabel ja tabelis hoida klassifikaatorID-d

link

vastatud Oct 30 '12 at 19:31

Arvi's gravatar image

Arvi
41113

Timestampi kommenteerisin Kaiko Kauri vastuses. Alla kümne erineva variandi jaoks hakata tegema eraldi klassifikaatorite tabelit oleks overkill.

(Nov 06 '12 at 12:08) skel
Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×1

küsitud: Oct 26 '12 at 13:12

nähtud: 2,604 korda

viimati uuendatud: Nov 06 '12 at 12:10

Sarnased küsimused

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee