JavaRush /Blog Jawa /Random-JV /Bagean 2. Struktur DBMS, tabel lan jinis data

Bagean 2. Struktur DBMS, tabel lan jinis data

Diterbitake ing grup
Pérangan pisanan
Bagean 2. Struktur DBMS, tabel lan jinis data - 1
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 idsaka 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 idkanggo ngenali model sing cocog. Pikiran langsung dadi pikiran sing bisa digunakake Map<Long, Object> kanggo nyimpen data kasebut, ing endi Objectmodel 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 Sharekanthi 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: Bagean 2. Struktur DBMS, tabel lan jinis data - 2 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:
Bagean 2. Struktur DBMS, tabel lan jinis data - 3

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)
Bagean 2. Struktur DBMS, tabel lan jinis data - 4
Referensi kanggo nilai tabel liyane bisa disetel kaya ing ngisor iki: ALTER TABLEtable_from_which_referred ADD FOREIGN KEY(field_that_referred) REFERENCEStable_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
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION