Birinji bölüm
Simpleönekeý bir exchangea emulýatorymyzy döretmäge dowam edýäris. Ine, näme ederis:
- Maglumatlar bazasynyň guramasynyň diagrammasyny döredeliň.
- Nämäniň, nädip we nirede saklanýandygyny düşündireris.
- Maglumatlaryň biri-biri bilen nähili baglanyşýandygyny öwreneliň.
- SQL esaslaryny SQL tablisasyny döretmek buýrugynyň mysalyny öwrenip başlalyň, SQL diliniň Maglumat kesgitleme dili ( DDL ).
- Java programmasyny ýazmagy dowam etdireliň. DBMS-iň esasy funksiýalaryny JDBC we üç derejeli arhitektura ulanyp, maglumatlar bazamyzy programma taýdan döretmek üçin java.sql nukdaýnazaryndan ýerine ýetirýäris.
Bu iki bölek has göwrümli boldy, sebäbi SQL esaslary we içinden DBMS guramasy bilen tanyşmaly we Java bilen meňzeşlikleri çekmeli. Kod sanawlary bilen sizi gyzyklandyrmazlyk üçin, ahyrynda programma bilen degişli github ammaryna baglanyşyklar bar.
DBMS dizaýny
Programmanyň beýany
Maglumat saklamagy guramagyň programmirlemegiň aýrylmaz bölegidigini eýýäm eşitdiňiz. Programmamyzyň maksadynyň iň ýönekeý alyş-çalyş emulýasiýasydygyny ýatladýaryn:
- Berlen düzgünlere laýyklykda söwda gününde gymmaty üýtgäp bilýän paýnamalar bar;
- başlangyç maýasy bolan söwdagärler bar;
- söwdagärler algoritmine görä paýlary satyn alyp we satyp bilerler.
Bir Thea
belliklerde işleýär - kesgitlenen wagt (biziň ýagdaýymyzda - 1 minut). Teklip wagtynda aksiýa bahasy üýtgäp biler, soň söwdagär paý satyn alyp ýa-da satyp biler.
Emulýasiýa maglumatlarynyň gurluşy
Aýry-aýry alyş-çalyş guramalarynyň modellerine jaň edeliň. Tegelek ýalňyşlyklardan gaça durmak üçin synp arkaly maliýe mukdary bilen işläris
BigDecimal
(jikme-jiklikleri makalanyň soňundaky baglanyşykdan tapyp bilersiňiz). Her modeliň gurluşyny has jikme-jik suratlandyralyň:
Mahabat:
Aýratynlyk |
Görnüşi |
Düşündiriş |
name |
Srting |
Ady |
changeProbability |
int |
Her bellikde göterim hökmünde nyrh üýtgemeginiň ähtimallygy |
startPrice |
BigDecimal |
Başlangyç bahasy |
delta |
int |
Häzirki bahanyň üýtgäp biljek göteriminde iň ýokary mukdar |
Paýlaşmagyň bahasy:
Aýratynlyk |
Görnüşi |
Düşündiriş |
operDate |
LocalDateTime |
Bahany kesgitlemek üçin wagt (bellik) |
share |
Mahabat |
Mahabatlandyrma baglanyşygy |
rate |
BigDecimal |
Paý bahasy |
Söwdagär:
Aýratynlyk |
Görnüşi |
Düşündiriş |
name |
Setir |
Bahany kesgitlemek üçin wagt (bellik) |
sfreqTick |
int |
Geleşikleriň ýygylygy. Söwdaçy amallary ýerine ýetirýän döwür bilen kesgitlenýär |
cash |
BigDecimal |
Paýlardan başga pul mukdary |
traidingMethod |
int |
Söwdagär tarapyndan ulanylýan algoritm. Hemişelik san hökmünde belläliň, algoritmiň ýerine ýetirilmegi Java kodunda (indiki bölümlerde) bolar |
changeProbability |
int |
Amaly tamamlamak ähtimallygy, göterim |
about |
Setir |
Her bellikde göterim derejesinde göterim üýtgemegi ähtimallygy |
Söwdaçylaryň hereketleri:
Aýratynlyk |
Görnüşi |
Düşündiriş |
operation |
int |
Geleşik görnüşi (satyn almak ýa-da satmak) |
traider |
Söwdagär |
Söwdaçy baglanyşygy |
shareRate |
Paý bahasy |
Bir stockanyň bahasyna baglanyşyk (degişlilikde paýnamanyň özi, bahasy we berlen wagty) |
amount |
Uzyn |
Geleşige gatnaşýan paýnamalaryň sany |
Her modeliň özboluşlylygyny üpjün etmek üçin uzyn görnüşliid
atribut goşarys . Bu atribut modelleriň içinde
özboluşly bolar we ony özboluşly kesgitlär. Beýleki modellere salgylanýan sypatlar (söwdagär, bir stocka, paýnamanyň bahasy) degişli modeli özboluşly kesgitlemek üçin ony ulanyp biler. Bu maglumatlary degişli model nirede saklamak üçin ulanyp biljekdigimiz baradaky pikir derrew kellä gelýär . Şeýle-de bolsa, aşakdaky şertlerde muny kodda durmuşa geçirmäge synanyşyň:
id
Map<Long, Object>
Object
- maglumatlaryň ululygy elýeterli RAM-dan ep-esli ýokarydyr;
- onlarça dürli ýerden maglumatlara garaşylýar;
- maglumatlary bir wagtda üýtgetmek we okamak ukyby talap edilýär;
- maglumatlaryň emele gelmegi we bitewiligi üçin düzgünleri üpjün etmek zerurdyr;
... we degişli kärleri we ýerine ýetirmek üçin wagt talap edýän meseleler bilen ýüzbe-ýüz bolarsyňyz. “Tigiri täzeden dikeltmegiň” zerurlygy ýok. Biziň üçin eýýäm köp zat oýlandy we ýazyldy. Şeýlelik bilen ýyllar boýy synagdan geçenleri ulanarys.
Java-da maglumatlary saklamak
Herekete seredeliň. Java-da bu model üçin belli bir
Share
synp döretdik
name
,,, . Köp paýlar açar her paý üçin özboluşly kesgitleýji bolup saklanýar .
changeProbability
startPrice
delta
Map<Long, Share>
public class Share {
private String name;
private BigDecimal startPrice;
private int changeProbability;
private int delta;
}
Map<Long, Share> shares = new HashMap<>();
shares.put(1L, new Share("ibm", BigDecimal.valueOf(20.0), 15, 10));
shares.put(2L, new Share("apple", BigDecimal.valueOf(14.0), 25, 15));
shares.put(3L, new Share("google", BigDecimal.valueOf(12.0), 20, 8));
...
shares.put(50L, new Share("microsoft", BigDecimal.valueOf(17.5), 10,4 ));
ID arkaly islenýän mahabata girmek üçin usuly ulanyň
shares.get(id)
. Ady ýa-da bahasy boýunça aksiýa tapmak meselesi üçin, zerur ýazgylary gözleýän ähli ýazgylary gözden geçirerdik we ş.m. Emma başga ýoldan gidip, bahalary DBMS-de saklarys.
DBMS-de maglumat saklamak
DBMS üçin maglumatlary saklamagyň düzgünleriniň başlangyç toplumyny düzeliň:
- DBMS-däki maglumatlar ýazgylar toplumy bolan tablisalara ( TABLE ) bölünýär .
- Recordshli ýazgylaryň birmeňzeş meýdany bar. Tablisa döredilende düzülýär.
- Meýdany deslapky baha ( DEFAULT ) edip bolýar .
- Tablisa üçin, maglumatlarynyň bitewiligini üpjün etmek üçin talaplary beýan edýän çäklendirmeleri ( CONSTRAINT ) belläp bilersiňiz. Bu tablisany döretmek tapgyrynda edilip bilner ( DÖWLET DÖWRÜ ) ýa-da soňrak goşup bolar ( ALTER TABLE ... CONSTRAINT ADD ).
- Iň ýaýran GÖRNÜŞ :
- Esasy açar PRIMARY (biziň ýagdaýymyzda Id).
- Üýtgeşik baha meýdany UNIQUE (Ulag stoly üçin VIN).
- CHECK meýdançasyny barlamak (göterim bahasy 100-den ýokary bolup bilmez). Meýdandaky şahsy çäklendirmeleriň biri NULL ýa-da NULL däl , bu NULL-yň stol meýdançasynda saklanmagyny gadagan edýän / rugsat berýän.
- Daşary ýurt açary üçin üçünji tarap tablisasyna baglanyşyk (paýnamanyň bahasy tablisasyndaky aksiýa baglanyşyk).
- Indeks INDEX (içindäki bahalary gözlemegi çaltlaşdyrmak üçin bir meýdany indekslemek).
- Fieldsazgylaryň üýtgedilmegi ( INSERT , UPDATE ) meýdanlarynyň bahalary çäklendirmelere ters gelse (CONSTRAINT) bolmaz.
- Her tablisada ýazgyny özboluşly kesgitlemek üçin ulanyp boljak esasy meýdan (ýa-da birnäçe) bolup biler. Şeýle meýdan (ýa-da birleşýän açar emele getirýän meýdanlar) tablisanyň esasy açaryny - PRIMARY KEY .
- Esasy açar, tablisadaky ýazgylaryň özboluşlylygyny üpjün edýär; üstünde esasy baha esasynda ähli ýazga çalt girip bilýän indeks döredilýär.
- Esasy açaryň bolmagy, tablisalaryň arasynda baglanyşyk döretmegi has aňsatlaşdyrýar. Ondan soň, emeli başlangyç açary ulanarys: ilkinji ýazgy üçin
id = 1
her indiki ýazgy, ID bahasy bir ýokarlandyrylan tablisa giriziler. Bu açara köplenç AutoIncrement ýa-da AutoIdentity diýilýär .
Aslynda, paýnamalaryň tablisasy:
Bu ýagdaýda paýnamanyň adyny açar hökmünde ulanmak mümkinmi? Umuman aýdanyňda - hawa, ýöne käbir kompaniýanyň dürli paýnamalary çykaryp, olary diňe öz ady bilen çagyrmagy ähtimal. Bu ýagdaýda indi özboluşlylyk bolmaz. Iş ýüzünde emeli başlangyç açar köplenç ulanylýar. Adamlaryň ýazgylaryny öz içine alýan tablisada doly ady özboluşly açar hökmünde ulanmak, özboluşlylygy üpjün etmez. Şeýle hem doly adyň we doglan senäniň utgaşmasyny ulanmak.
DBMS-de maglumatlaryň görnüşleri
Beýleki programmirleme dili ýaly SQL-da maglumat ýazuwy bar. Ine iň köp ýaýran SQL maglumat görnüşleri:
Bitewi görnüşler
SQL görnüşi |
SQL sinonimleri |
Java-da gabat gelmek |
Düşündiriş |
INT |
INT4, INTEGER |
java.lang.Integer |
4 baýtlyk bitewi san, -2147483648… 2147483647 |
BOOLEAN |
BOOL, BIT |
java.lang.Boolean |
Dogry ýalňyş |
TINYINT |
|
java.lang.Baýte |
1 baýtlyk bitewi san, -128… 127 |
Kiçijik |
INT2 |
java.lang.Sort |
2 baýtlyk bitewi san, -32768… 32767 |
ULY |
INT8 |
java.lang. Uzyn |
8 baýtlyk bitewi san, -9223372036854775808… 9223372036854775807 |
AUTO_INCREMENT |
GIRIŞ |
java.lang. Uzyn |
Tablisa mahsus artýan hasaplaýjy. Oňa täze bir baha girizilse, bir köpelýär. Döredilen bahalar hiç haçan gaýtalanmaýar. |
Hakyky
SQL görnüşi |
SQL sinonimleri |
Java-da gabat gelmek |
Düşündiriş |
DEKIMAL (N, M) |
DEK, Nomer |
java.math.BigDecimal |
Kesgitlenen takyklyk onluk (N bitewi sanlar we M fraksiýa sanlary). Esasan maliýe maglumatlary bilen işlemek üçin niýetlenendir. |
Jübüt |
FLOAT8 |
java.lang.Double |
Iki gezek takyk hakyky san (8 baýt). |
HAKYKAT |
FLOAT4 |
java.lang.Real |
Takyk takyk hakyky san (4 baýt). |
Setir
SQL görnüşi |
SQL sinonimleri |
Java-da gabat gelmek |
Düşündiriş |
WARÇAR (N) |
NWARÇAR |
java.lang.String |
UNICODE uzynlygy N. uzynlygy 2147483647 bilen çäklenýär Setiriň ähli mazmunyny ýada salýar. |
senesi we wagty
SQL görnüşi |
SQL sinonimleri |
Java-da gabat gelmek |
Düşündiriş |
WAGT |
|
java.time.LocalTime, java.sql.Time |
DATETIME öwrülende wagt saklamak (nanosekuntlara çenli), senesi 1970-nji ýylyň 1-nji ýanwaryna bellendi. |
Sene |
|
java.time.LocalDate, java.sql.Timestamp |
Seneleri yyyy-mm-dd formatda saklamak, wagt 00:00 hökmünde kesgitlenýär |
DATETIME |
TIMESTAMP |
java.time.LocalDateTime, java.sql.Timestamp |
Sene + wagt saklamak (wagt guşaklygyny hasaba almazdan). |
Uly göwrümli maglumatlary saklamak
SQL görnüşi |
Java-da gabat gelmek |
Düşündiriş |
BLOB |
java.io.InputStream, java.sql.Blob |
Ikilik maglumatlary saklamak (suratlar, faýllar ...). |
CLOB |
java.io.Reader, java.sql.Clob |
Uly tekst maglumatlary (kitaplar, makalalar ...) saklamak, VARCHAR-dan tapawutlylykda maglumatlary böleklere ýada salýar. |
SQL ýazuw stili
Köp diller üçin kod formatlamak boýunça görkezmeler bar. Adatça, şeýle resminamalarda üýtgeýänleri, yzygiderliligi, usullary we beýleki dil gurluşlaryny atlandyrmagyň düzgünleri bar.
Şeýlelik bilen, Python üçin PEP8, Java üçin - Java üçin Oracle Code konwensiýalary bar . SQL üçin biri-birinden azajyk tapawutlanýan birnäçe dürli toplum döredildi. Her niçigem bolsa, koduňyzy format edeniňizde, esasanam bir toparda işleýän bolsaňyz, düzgünlere eýermek endigini ösdürmeli. Düzgünler, mysal üçin aşakdakylar bolup biler (elbetde, özüňiz üçin başga düzgünler toplumyny döredip bilersiňiz, esasy zat geljekde olara ýapyşmakdyr):
- Buýruklary we operatorlary öz içine alýan açar sözler we ätiýaçlandyrylan sözler baş harplar bilen ýazylmalydyr: JEMLE .JI, GÖRNÜŞ ...
- Tablisalaryň, meýdanlaryň we beýleki obýektleriň atlary SQL dil açar sözlerine gabat gelmeli däldir (makalanyň soňundaky baglanyşyga serediň), ýöne olary öz içine alyp biler.
- Tablisa atlary olaryň maksadyny görkezmelidir. Olar kiçi harplar bilen ýazylýar. Adyndaky sözler biri-birinden aşaky çyzyklar bilen bölünýär. Ahyryndaky söz köplükde bolmaly : söwdagärler (söwdagärler), paý_ratlar (paý paýy).
- Tablisa meýdan atlary olaryň maksadyny görkezmelidir. Olar kiçi harplar bilen ýazylmalydyr, adyndaky sözler Düýe Case stilinde formatlanmalydyr we ahyrynda söz ýeketäk ulanylmalydyr : ady (ady), paýlaşma bahasy (paý paýy).
- Emeli açar meýdanlarynda id sözi bolmaly.
- GYSGAÇA atlar tablisanyň atlandyryş konwensiýalaryna eýermelidir. Şeýle hem, olara gatnaşýan meýdanlary we tablisalary öz içine almaly, semantik prefiksden başlamaly: check_ (meýdan bahasyny barlamak), pk_ (esasy açar), fk_ (daşary ýurt açary), uniq_ (meýdan özboluşlylygy), idx_ (indeks). Mysal: pk_traider_share_actions_id (söwdagär_share_actions tablisasy üçin id meýdançasyndaky esasy açar).
- SQL-i öwreneniňizde düzgünleriň sanawy doldurylýar / üýtgediler.
DBMS dizaýny
DBMS döretmezden ozal dizaýn edilmeli. Iň soňky shemada tablisalar, meýdanlar toplumy, GÖRNÜŞ, düwmeler, meýdanlar üçin deslapky şertler, tablisalar we beýleki maglumatlar bazasynyň arasyndaky gatnaşyklar bar. Internetde kiçi DBMS dizaýn etmek üçin köp mugt onlaýn / awtonom dizaýnerleri tapyp bilersiňiz. Gözleg motoryna “Maglumat bazasynyň dizaýneri mugt” ýaly bir zady ýazyp görüň. Şeýle programmalaryň peýdaly goşmaça aýratynlyklary bar:
- DBMS döretmek üçin SQL buýruklaryny döredip biler.
- Sazlamalary diagrammada wizual görkeziň.
- Has gowy görmek üçin tablisalary göçürmäge mümkinçilik berýär.
- Diagrammada düwmeleri, indeksleri, gatnaşyklary, deslapky bahalary we şuňa meňzeşleri görkeziň.
- DBMS shemasyny uzakdan saklap bilerler.
Mysal üçin,
dbdiffo.com düwmeleri görkezýär, boş däl meýdanlary we NN belligi bolan AI (AutoIncrement) hasaplaýjylaryny görkezýär:
DBMS-de tablisa döretmek
Şonuň üçin bizde diagramma bar. Indi tablisalary döretmäge geçeliň (Tablisa dörediň). Munuň üçin deslapky maglumatlaryň bolmagy maslahat berilýär:
- tablisanyň ady
- meýdan atlary we görnüşi
- meýdanlarynda çäklendirmeler (CONSTRAINTS)
- meýdanlar üçin deslapky bahalar (bar bolsa)
- bar bolsa esasy açar (PRIMARY KEY)
- tablisalaryň arasyndaky baglanyşyk (Daşary ýurt açary)
“CREATE TABLE” buýrugynyň ähli wariantlaryny jikme-jik öwrenmeris; söwdagärler üçin tablisa döretmek mysaly bilen SQL-iň esaslaryna serederis:
CREATE TABLE traiders(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
freqTiсk INTEGER NOT NULL,
cash DECIMAL(15,2) NOT NULL DEFAULT 1000,
tradingMethod INTEGER NOT NULL,
changeProbability INTEGER NOT NULL DEFAULT 50,
about VARCHAR(255) NULL
);
ALTER TABLE traiders ADD CONSTRAINT check_traiders_tradingMethod
CHECK(tradingMethod IN (1,2,3));
ALTER TABLE traiders ADD CONSTRAINT check_traiders_changeProbability
CHECK(changeProbability <= 100 AND changeProbability > 0)
Geliň, has içgin seredeliň:
CREATE TABLE traiders
(meýdan beýany) - görkezilen at bilen tablisany döredýär; düşündirişde meýdanlar vergul bilen bölünýär. Islendik buýruk nokat bilen gutarýar.
- Meýdanyň beýany, adyndan başlaýar, yzyndan görnüşi, CONSTRAINT we başlangyç bahasy.
id BIGINT AUTO_INCREMENT PRIMARY KEY
- bitewi görnüşiň id meýdany esasy açar we artýan hasaplaýjydyr (id meýdançasy üçin her täze ýazgy üçin bu tablisada öň döredileninden has uly baha dörediler).
cash DECIMAL(15,2) NOT NULL DEFAULT 1000
- nagt meýdan, onluk, onluk nokatdan 15 san we ondan soň iki san (maliýe maglumatlary, mysal üçin dollar we sent). NULL bahalaryny kabul edip bolmaýar Hiç hili baha berilmese, 1000 bahasyny alar.
about VARCHAR(255) NULL
- meýdany, uzynlygy 255 simwoldan ybarat setir, boş bahalary kabul edip biler.
Tablisa döredilenden soň CONSTRAINT şertleriniň bir bölegini düzüp biljekdigimize üns beriň . Tablisanyň gurluşyny we meýdanlaryny üýtgetmek üçin gurluşy gözden geçireliň:
ALTER TABLE table_name ADD CONSTRAINT çäklendirme_name CHECK (şert) mysallary ulanyp:
CHECK(tradingMethod IN (1,2,3))
- söwda usuly usuly diňe 1,2,3 bahany alyp biler
CHECK(changeProbability <= 100 AND changeProbability > 0)
- ChangeProbability meýdany 1-den 100 aralygynda bitewi bahalary alyp biler
Tablisalaryň arasyndaky gatnaşyklar
Tablisalaryň arasyndaky gatnaşyklaryň beýanyny seljermek üçin, paýlaşma_ratlaryň döredilmegine seredeliň:
CREATE TABLE share_rates(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
operDate datetime NOT NULL,
share BIGINT NOT NULL,
rate DECIMAL(15,2) NOT NULL
);
ALTER TABLE share_rates ADD FOREIGN KEY (share) REFERENCES shares(id)
Başga bir tablisanyň bahalaryna salgylanma aşakdaky ýaly kesgitlenip bilner:
ALTER TABLE
table_from_which_referred
ADD FOREIGN KEY
(field_that_referred)
REFERENCES
table_to_which_referred (field_that_referred) Paýnamalarda
paýnamalarymyz bar, mysal üçin id = 50 üçin Microsoft paýnamalaryny başlangyç bahasy bilen saklaýarys 17.5, 20 deltasy we 4% üýtgemegi mümkinçiligi.
“Share_rates” tablisasy üçin üç sany esasy häsiýet alýarys:
- ID açarynyň bahasyny paýnamalar tablisasyndan galan maglumatlary (ady we ş.m.) almak üçin ulanmak üçin paý meýdançasyndaky paýnamalar tablisasyndan saklamaly.
- Promotionok bolan mahabat üçin nyrh döredip bilmeris. Paýlaşma meýdanyna ýok bahany girizip bilmersiňiz (munuň üçin paýnamalar tablisasynda bu id bilen ýazgy ýok), sebäbi tablisalaryň arasynda hat ýok.
- Share_rates-de nyrhlar kesgitlenen paýnamalardaky paý ýazgysyny pozup bilmeris.
Soňky iki nokat, saklanylýan maglumatlaryň bitewiligini üpjün etmek üçin hyzmat edýär. Emulýasiýamyzyň SQL tablisalarynyň döredilmegini we makalanyň ahyrynda github ammaryna baglanyşygy ulanyp, degişli synplaryň usullaryny Java ýerine ýetirişinde SQL talaplarynyň mysallaryny görüp bilersiňiz.
Üçünji bölüm
GO TO FULL VERSION