Pérangan pisanan
Kita terus nggawe emulator bursa saham sing prasaja. Punika ingkang badhe kita tindakaken:
- Ayo nggawe diagram organisasi database.
- Kita bakal njlèntrèhaké apa, carane lan ing ngendi iku disimpen.
- Ayo goleki kepiye hubungane data.
- Ayo miwiti sinau dhasar SQL nggunakake conto perintah nggawe tabel SQL CREATE TABLE , Data Definition Language ( DDL ) saka basa SQL.
- Ayo nerusake nulis program Jawa. Kita ngleksanakake fungsi utama DBMS ing syarat-syarat java.sql kanggo nggawe database programmatically, nggunakake JDBC lan arsitektur telung undakan.
Rong bagean kasebut dadi luwih akeh, amarga kita kudu ngerti dhasar SQL lan organisasi DBMS saka njero, lan nggambar analogi karo Jawa. Supaya sampeyan ora bosen karo dhaptar kode, ing pungkasan ana pranala menyang repositori github komit sing cocog karo program kasebut.
desain DBMS
Deskripsi Aplikasi
Sampeyan wis krungu manawa ngatur panyimpenan data minangka bagean integral saka program. Ayo kula ngelingake yen tujuan aplikasi kita yaiku emulasi ijol-ijolan sing paling gampang:
- Ana saham sing regane bisa diganti sajrone dina dagang miturut aturan sing diwenehake;
- ana pedagang sing duwe modal dhisikan;
- pedagang bisa tuku lan adol saham miturut algoritma.
Ijol-ijolan makaryakke
ing ticks - wektu tetep (ing kasus kita - 1 menit). Sajrone obah, rega saham bisa diganti, banjur pedagang bisa tuku utawa ngedol saham.
Struktur data emulasi ijol-ijolan
Ayo nelpon model entitas ijol-ijolan individu. Kanggo ngindhari kesalahan pembulatan, kita bakal nggarap jumlah finansial liwat kelas
BigDecimal
(rincian bisa ditemokake ing link ing pungkasan artikel). Ayo njlentrehake struktur saben model kanthi luwih rinci:
Promosi:
Atribut |
Jinis |
Katrangan |
name |
Srting |
jeneng |
changeProbability |
int |
Kemungkinan owah-owahan tarif minangka persentase ing saben centhang |
startPrice |
BigDecimal |
Biaya wiwitan |
delta |
int |
Jumlah maksimum ing persentasi kang Nilai saiki bisa ngganti |
rega saham:
Atribut |
Jinis |
Katrangan |
operDate |
LocalDateTime |
Wektu (obah) kanggo nyetel tarif |
share |
promosi |
Link kanggo promosi |
rate |
BigDecimal |
Rega saham |
Pedagang:
Atribut |
Jinis |
Katrangan |
name |
String |
Wektu (obah) kanggo nyetel tarif |
sfreqTick |
int |
Frekuensi transaksi. Ditemtokake dening periode, ing ticks, sawise kang pedagang nindakake operasi |
cash |
BigDecimal |
Jumlah dhuwit liyane saka Enggo bareng |
traidingMethod |
int |
Algoritma sing digunakake dening pedagang. Ayo disetel minangka nomer pancet, implementasine saka algoritma bakal (ing bagean ngisor) ing kode Jawa |
changeProbability |
int |
Kemungkinan ngrampungake operasi, persentase |
about |
String |
Kemungkinan owah-owahan tarif, ing persentase, ing saben centhang |
Tindakan pedagang:
Atribut |
Jinis |
Katrangan |
operation |
int |
Jinis transaksi (tuku utawa adol) |
traider |
Pedagang |
Link pedagang |
shareRate |
Rega saham |
Link menyang rega saham (mungguh, saham dhewe, tarif lan wektu diterbitake) |
amount |
dawa |
Jumlah Enggo bareng melu ing transaksi |
Kanggo mesthekake keunikan saben model, kita bakal nambah atribut
id
saka jinis
dawa . Atribut iki bakal
unik ing conto model lan bakal ngenali kanthi unik. Atribut sing ngrujuk model liyane (pedagang, saham, rega saham) bisa digunakake
id
kanggo ngenali model sing cocog. Pikiran langsung dadi pikiran sing bisa digunakake
Map<Long, Object>
kanggo nyimpen data kasebut, ing endi
Object
model sing cocog. Nanging, coba terapake kode kasebut ing kahanan ing ngisor iki:
- ukuran data Ngartekno ngluwihi jumlah RAM kasedhiya;
- akses menyang data wis samesthine saka rolas panggonan beda;
- kemampuan kanggo ngowahi lan maca data bebarengan dibutuhake;
- perlu kanggo mesthekake aturan kanggo tatanan lan integritas data;
...lan sampeyan bakal ngadhepi tugas sing mbutuhake kualifikasi lan wektu sing tepat kanggo dileksanakake. Ana ora perlu kanggo "reinvent setir". Akeh sing wis dipikirake lan ditulis kanggo kita. Dadi, kita bakal nggunakake apa sing wis diuji sajrone pirang-pirang taun.
Nyimpen Data ing Jawa
Ayo nimbang tumindak. Ing Jawa, kita nggawe kelas tartamtu kanggo model iki
Share
kanthi kolom
name
,
changeProbability
,
startPrice
,
delta
. Lan akeh saham sing disimpen minangka
Map<Long, Share>
, ing ngendi kunci kasebut minangka pengenal unik kanggo saben saham.
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 ));
Kanggo ngakses promosi sing dikarepake kanthi ID, gunakake metode kasebut
shares.get(id)
. Kanggo tugas nemokake saham kanthi jeneng utawa rega, kita bakal ngubengi kabeh cathetan sing nggoleki sing dibutuhake, lan liya-liyane. Nanging kita bakal pindhah cara liyane lan nyimpen nilai ing DBMS.
Panyimpenan data ing DBMS
Ayo kita ngrumusake set dhisikan aturan panyimpenan data kanggo DBMS:
- Data ing DBMS diatur dadi tabel ( TABLE ), yaiku sakumpulan rekaman.
- Kabeh cathetan duwe set lapangan sing padha. Padha disetel nalika nggawe meja.
- Lapangan bisa disetel menyang nilai standar ( DEFAULT ).
- Kanggo tabel, sampeyan bisa nyetel watesan ( CONSTRAINT ) sing njlèntrèhaké syarat kanggo data kanggo njamin integritas. Iki bisa ditindakake ing tahap nggawe tabel ( CREATE TABLE ) utawa ditambahake mengko ( ALTER TABLE ... ADD CONSTRAINT ).
- CONSTRAINT sing paling umum :
- Kunci utama yaiku PRIMARY (Id ing kasus kita).
- Bidang nilai unik UNIK (VIN kanggo tabel kendaraan).
- Priksa lapangan CHECK (nilai persentase ora bisa luwih saka 100). Salah sawijining watesan pribadi ing lapangan yaiku NOT NULL utawa NULL , sing nglarang / ngidini nyimpen NULL ing kolom tabel.
- Link menyang tabel pihak katelu FOREIGN KEY (link menyang saham ing tabel rega saham).
- Indeks INDEX (ngindeks lapangan kanggo nyepetake telusuran nilai ing njero).
- Modifikasi rekaman ( INSERT , UPDATE ) ora bakal kedadeyan yen nilai kolom kasebut mbantah watesan (KONSTRAINT).
- Saben tabel bisa duwe kolom kunci (utawa sawetara) sing bisa digunakake kanggo ngenali rekaman kanthi unik. Kolom kasebut (utawa kolom, yen mbentuk kunci gabungan) mbentuk kunci utama tabel - KUNCI PRIMARY .
- Tombol utami njamin keunikan rekaman ing tabel; indeks digawe ing ndhuwur, sing menehi akses cepet menyang kabeh rekaman adhedhasar nilai kunci.
- Nduwe kunci utama nggawe luwih gampang nggawe tautan ing antarane tabel. Sabanjure, kita bakal nggunakake kunci utama gawean: kanggo rekaman pisanan
id = 1
, saben rekaman sakteruse bakal dilebokake ing tabel kanthi nilai id tambah siji. Tombol iki asring diarani AutoIncrement utawa AutoIdentity .
Bener, tabel saham:
Apa bisa nggunakake jeneng saham minangka kunci ing kasus iki? Umumé - ya, nanging ana kemungkinan sawetara perusahaan ngetokake saham sing beda-beda lan mung diarani kanthi jeneng dhewe. Ing kasus iki, ora bakal ana keunikan maneh. Ing praktik, kunci utama buatan asring digunakake. Setuju, nggunakake jeneng lengkap minangka kunci unik ing tabel sing ngemot cathetan wong ora bakal njamin keunikan. Uga nggunakake kombinasi jeneng lengkap lan tanggal lair.
Jinis data ing DBMS
Kaya basa pamrograman liyane, SQL nduweni ketik data. Ing ngisor iki jinis data SQL sing paling umum:
Jinis integer
Tipe SQL |
sinonim SQL |
Mathuk ing Jawa |
Katrangan |
INT |
INT4, INTEGER |
java.lang.Integer |
4-byte integer, -2147483648 … 2147483647 |
BOOLEAN |
BOOL, BIT |
java.lang.Boolean |
Bener, Palsu |
TINYINT |
|
java.lang.Byte |
1-byte integer, -128 ... 127 |
Cilik |
INT2 |
java.lang.Short |
2-byte integer, -32768 … 32767 |
BIGINT |
INT8 |
java.lang.Long |
8-byte integer, -9223372036854775808 … 9223372036854775807 |
AUTO_INCREMENT |
TAMBAHAN |
java.lang.Long |
Counter tambahan sing unik kanggo meja. Yen dilebokake nilai anyar, tambah siji, nilai sing digawe ora bakal diulang maneh. |
Nyata
Tipe SQL |
sinonim SQL |
Mathuk ing Jawa |
Katrangan |
DESIMAL(N,M) |
DEC, NOMOR |
java.math.BigDecimal |
Desimal presisi tetep (digit integer N lan digit pecahan M). Utamane dirancang kanggo nggarap data finansial. |
GANDA |
NGAMUNG8 |
java.lang.Dobel |
Nomer nyata presisi kaping pindho (8 bita). |
NYATA |
NGAMUNG4 |
java.lang.Real |
Nomer nyata presisi tunggal (4 bita). |
String
Tipe SQL |
sinonim SQL |
Mathuk ing Jawa |
Katrangan |
VARCHAR(N) |
NVARCHAR |
java.lang.String |
UNICODE string dawa N. Dawane winates kanggo 2147483647 Muat kabeh isi string menyang memori. |
tanggal lan wektu
Tipe SQL |
sinonim SQL |
Mathuk ing Jawa |
Katrangan |
WAKTU |
|
java.time.LocalTime, java.sql.Time |
Wektu nyimpen (nganti nanodetik), nalika diowahi dadi DATETIME, tanggal disetel dadi 1 Januari 1970. |
TANGGAL |
|
java.time.LocalDate, java.sql.Timestamp |
Nyimpen tanggal ing format yyyy-mm-dd, wektu disetel minangka 00:00 |
DATETIME |
TIMESTAMP |
java.time.LocalDateTime, java.sql.Timestamp |
Nyimpen tanggal + wektu (tanpa nimbang zona wektu). |
Panyimpenan volume gedhe saka data
Tipe SQL |
Mathuk ing Jawa |
Katrangan |
BLOB |
java.io.InputStream, java.sql.Blob |
Nyimpen data binar (gambar, file ...). |
CLOB |
java.io.Reader, java.sql.Clob |
Nyimpen data teks gedhe (buku, artikel ...), ora kaya VARCHAR, ngemot data menyang memori kanthi bagean. |
Gaya nulis SQL
Kanggo akeh basa, ana pedoman format kode. Biasane, dokumen kasebut ngemot aturan kanggo menehi jeneng variabel, konstanta, metode lan struktur basa liyane. Dadi, kanggo Python ana PEP8, kanggo
Java - Oracle Code Conventions for Java . Sawetara set beda wis digawe kanggo SQL, sing rada beda saka saben liyane. Ora preduli, sampeyan kudu nggawe kebiasaan ngetutake aturan nalika ngowahi format kode, utamane yen sampeyan kerja ing tim. Aturan kasebut bisa uga, contone, ing ngisor iki (mesthi, sampeyan bisa ngembangake aturan sing beda kanggo sampeyan dhewe, sing utama yaiku tetep ing mangsa ngarep):
- Tembung kunci lan tembung sing dilindhungi, kalebu prentah lan operator, kudu ditulis nganggo huruf kapital: GAMBAR TABEL, KONSTRAINT...
- Jeneng tabel, kolom lan obyek liyane ora cocog karo tembung kunci basa SQL (deleng tautan ing pungkasan artikel), nanging bisa uga ngemot.
- Jeneng tabel kudu nggambarake tujuane. Ditulis nganggo aksara cilik. Tembung-tembung ing jeneng kasebut dipisahake saka saben liyane kanthi garis ngisor. Tembung ing pungkasan kudu ing jamak : pedagang (pedagang), share_rates (share rate).
- Jeneng kolom tabel kudu nggambarake tujuane. Dheweke kudu ditulis nganggo huruf cilik, tembung ing jeneng kasebut kudu diformat nganggo gaya Camel Case , lan tembung ing pungkasan kudu digunakake ing tunggal : jeneng (jeneng), share_rates (tingkat saham).
- Kolom tombol artifisial kudu ngemot tembung id.
- Jeneng CONSTRAINT kudu ngetutake konvensi penamaan tabel. Dheweke uga kudu nyakup kolom lan tabel, diwiwiti kanthi awalan semantik: check_ (mriksa nilai lapangan), pk_ (kunci utama), fk_ (kunci asing), uniq_ (keunikan lapangan), idx_ (indeks). Conto: pk_traider_share_actions_id (kunci utama ing kolom id kanggo tabel trader_share_actions).
- Lan sateruse, nalika sampeyan sinau SQL, dhaptar aturan bakal diisi maneh / diganti.
desain DBMS
Sanalika sadurunge nggawe DBMS, kudu dirancang. Skema pungkasan ngemot tabel, sakumpulan kolom, CONSTRAINT, tombol, kahanan standar kanggo lapangan, hubungan antarane tabel lan entitas database liyane. Ing Internet sampeyan bisa nemokake akeh desainer online / offline gratis kanggo ngrancang DBMS cilik. Coba ketik kaya "Desainer Database gratis" menyang mesin telusur. Aplikasi kasebut duwe sifat tambahan sing migunani:
- Bisa ngasilake perintah SQL kanggo nggawe DBMS.
- Tampilake setelan ing diagram kanthi visual.
- Ngidini sampeyan mindhah tabel kanggo visualisasi sing luwih apik.
- Tampilake kunci, indeks, hubungan, nilai standar, lan liya-liyane ing diagram.
- Dheweke bisa nyimpen skema DBMS saka jarak jauh.
Contone,
dbdiffo.com nyorot tombol, nuduhake kolom sing ora kosong lan counter AI (AutoIncrement) kanthi label NN:
Nggawe tabel ing DBMS
Dadi kita duwe diagram. Saiki ayo pindhah menyang nggawe tabel (CREATE TABLE). Kanggo nindakake iki, disaranake kita duwe data awal:
- jeneng meja
- jeneng lapangan lan jinis
- watesan (KONSTRAIN) ing lapangan
- nilai standar kanggo kolom (yen kasedhiya)
- kunci utama (KEY UTAMA) yen kasedhiya
- sambungan antarane tabel (KEY ASING)
Kita ora bakal nyinaoni kanthi rinci kabeh opsi perintah CREATE TABLE; kita bakal ndeleng dhasar SQL nggunakake conto nggawe tabel kanggo pedagang:
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)
Ayo katon luwih cedhak:
CREATE TABLE traiders
(deskripsi lapangan) - nggawe tabel kanthi jeneng sing ditemtokake; ing katrangan, kolom dipisahake karo koma. Sembarang printah rampung karo titik koma.
- Katrangan lapangan diwiwiti kanthi jeneng, diikuti karo jinis, CONSTRAINT, lan nilai standar.
id BIGINT AUTO_INCREMENT PRIMARY KEY
- kolom id saka jinis integer minangka kunci utama lan counter incremental (kanggo saben rekaman anyar kanggo kolom id, nilai bakal diasilake sing luwih gedhe tinimbang sing sadurunge digawe kanggo tabel iki).
cash DECIMAL(15,2) NOT NULL DEFAULT 1000
- lapangan awis, desimal, 15 digit sadurunge titik desimal lan loro sawise (data finansial, contone, dolar lan sen). Ora bisa nampa nilai NULL. Yen ora ana regane, bakal entuk nilai 1000.
about VARCHAR(255) NULL
- lapangan babagan, senar nganti 255 karakter, bisa nampa nilai kosong.
Elinga yen kita bisa nyetel bagean saka kahanan
CONSTRAINT sawise nggawe tabel. Ayo dipikirake konstruksi kanggo ngowahi struktur tabel lan kolom:
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (kondisi) nggunakake conto:
CHECK(tradingMethod IN (1,2,3))
- kolom tradingMethod mung bisa njupuk nilai 1,2,3
CHECK(changeProbability <= 100 AND changeProbability > 0)
– kolom changeProbability bisa njupuk nilai integer ing sawetara saka 1 kanggo 100
Hubungan antarane tabel
Kanggo nganalisa deskripsi hubungan antarane tabel, ayo goleki nggawe share_rates:
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)
Referensi kanggo nilai tabel liyane bisa disetel kaya ing ngisor iki:
ALTER TABLE
table_from_which_referred
ADD FOREIGN KEY
(field_that_referred)
REFERENCES
table_to_which_referred (field_that_referred to) Ayo ing
Enggo bareng kita duwe cathetan ing Enggo bareng, contone, kanggo id=50 kita nyimpen saham Microsoft karo rega awal 17,5, delta 20 lan kasempatan kanggo owah-owahan 4%. Kanggo tabel
share_rates kita entuk telung properti utama:
- Kita mung kudu nyimpen nilai kunci id saka tabel saham ing kolom bareng supaya bisa digunakake kanggo entuk informasi sing isih ana (jeneng, lsp.) saka tabel saham.
- Kita ora bisa nggawe tarif kanggo promosi sing ora ana. Sampeyan ora bisa nglebokake nilai sing ora ana ing kolom bareng (sing ora ana cathetan ing tabel saham karo id iki), amarga ora ana korespondensi antarane tabel.
- Kita ora bisa mbusak entri nuduhake ing saham sing tarif disetel ing share_rates.
Rong poin pungkasan kanggo njamin integritas data sing disimpen. Sampeyan bisa ndeleng nggawe tabel SQL emulasi kita lan conto pitakon SQL ing implementasine metode Java saka kelas sing cocog nggunakake link menyang repositori github ing pungkasan artikel.
Pérangan katelu
GO TO FULL VERSION