JavaRush /Java blogi /Random-UZ /2-qism. DBMS tuzilishi, jadvallar va ma'lumotlar turlari

2-qism. DBMS tuzilishi, jadvallar va ma'lumotlar turlari

Guruhda nashr etilgan
Birinchi qism
2-qism. DBMS tuzilishi, jadvallar va ma'lumotlar turlari - 1
Biz oddiy birja emulyatorimizni yaratishda davom etamiz. Mana biz nima qilamiz:
  • Keling, ma'lumotlar bazasini tashkil qilish sxemasini tuzamiz.
  • Biz nima, qanday va qaerda saqlanishini tasvirlaymiz.
  • Keling, ma'lumotlar bir-biri bilan qanday bog'liqligini bilib olaylik.
  • Keling , SQL tilining CREATE TABLE , Data Definition Language ( DDL ) SQL jadvalini yaratish buyrug'i misolidan foydalanib SQL asoslarini o'rganishni boshlaylik .
  • Keling, Java dasturini yozishni davom ettiramiz. Biz JDBC va uch bosqichli arxitekturadan foydalangan holda ma'lumotlar bazasini dasturiy jihatdan yaratish uchun java.sql nuqtai nazaridan DBMSning asosiy funktsiyalarini amalga oshiramiz.
Ushbu ikki qism yanada hajmli bo'lib chiqdi, chunki biz SQL asoslari va ichki ma'lumotlar bazasi tizimini tashkil qilish bilan tanishishimiz va Java bilan o'xshashliklarni chizishimiz kerak. Kodlar ro'yxati bilan sizni zeriktirmaslik uchun, oxirida dastur bilan tegishli commit github omboriga havolalar mavjud.

DBMS dizayni

Ilova tavsifi

Ma'lumotlarni saqlashni tashkil etish dasturlashning ajralmas qismi ekanligini allaqachon eshitgansiz. Shuni eslatib o'tamanki, bizning dasturimizning maqsadi eng oddiy almashinuv emulyatsiyasi:
  • Berilgan qoidalarga muvofiq savdo kuni davomida qiymati o'zgarishi mumkin bo'lgan aksiyalar mavjud;
  • boshlang'ich kapitalga ega treyderlar bor;
  • treyderlar o'zlarining algoritmlariga ko'ra aktsiyalarni sotib olishlari va sotishlari mumkin.
Birja Shomillarda ishlaydi - belgilangan vaqt oralig'ida (bizning holatlarimizda - 1 daqiqa). Shomil paytida aktsiya narxi o'zgarishi mumkin, keyin esa treyder aktsiyalarni sotib olishi yoki sotishi mumkin.

Emulyatsiya ma'lumotlari tuzilishini almashish

Ayrim birja sub'ektlari modellarini chaqiraylik. Yaxlitlashda xatolikka yo'l qo'ymaslik uchun biz moliyaviy miqdorlar bilan sinf orqali ishlaymiz BigDecimal(batafsil ma'lumotlarni maqolaning oxiridagi havolada topishingiz mumkin). Keling, har bir modelning tuzilishini batafsilroq tasvirlab beraylik: Rag'batlantirish:
Xususiyat Turi Tavsif
name Srting Ism
changeProbability int Har bir belgi bo'yicha foiz sifatida stavkaning o'zgarishi ehtimoli
startPrice Katta o'nlik Dastlabki xarajat
delta int Joriy qiymat o'zgarishi mumkin bo'lgan foizdagi maksimal miqdor
Aksiya narxi:
Xususiyat Turi Tavsif
operDate LocalDateTime Tarifni belgilash vaqti (belgi).
share Rag'batlantirish Rag'batlantirish uchun havola
rate Katta o'nlik Aksiya narxi
Savdogar:
Xususiyat Turi Tavsif
name String Tarifni belgilash vaqti (belgi).
sfreqTick int Tranzaktsiyalarning chastotasi. Davr bilan ko'rsatilgan, Shomil bilan, keyin savdogar operatsiyalarni amalga oshiradi
cash Katta o'nlik Aktsiyalardan tashqari pul miqdori
traidingMethod int Treyder tomonidan ishlatiladigan algoritm. Keling, uni doimiy raqam sifatida belgilaymiz, algoritmni amalga oshirish (keyingi qismlarda) Java kodida bo'ladi.
changeProbability int Operatsiyani yakunlash ehtimoli, foiz
about String Har bir belgi bo'yicha stavkaning o'zgarishi ehtimoli, foizda
Savdogarning harakatlari:
Xususiyat Turi Tavsif
operation int Bitim turi (sotib olish yoki sotish)
traider Savdogar Savdogar havolasi
shareRate Aksiya narxi Aksiya narxiga havola (mos ravishda aktsiyaning o'zi, uning kursi va chiqarilgan vaqti)
amount Uzoq Bitimga jalb qilingan aksiyalar soni
Har bir modelning o'ziga xosligini ta'minlash uchun biz longid tipidagi atributni qo'shamiz . Bu atribut model misollarida noyob bo'ladi va uni noyob tarzda aniqlaydi. Boshqa modellarga murojaat qiluvchi atributlar (treyder, aktsiya, aktsiya bahosi) mos modelni yagona aniqlash uchun undan foydalanishi mumkin . Biz bunday ma'lumotlarni saqlash uchun foydalanishimiz mumkin degan fikr darhol xayolga keladi , mos keladigan model qaerda. Biroq, buni quyidagi shartlar ostida kodda amalga oshirishga harakat qiling: idMap<Long, Object>Object
  • ma'lumotlar hajmi mavjud RAM miqdoridan sezilarli darajada oshadi;
  • ma'lumotlarga kirish o'nlab turli joylardan kutilmoqda;
  • ma'lumotlarni bir vaqtning o'zida o'zgartirish va o'qish qobiliyati talab qilinadi;
  • ma'lumotlarning shakllanishi va yaxlitligi qoidalarini ta'minlash zarur;
...va siz tegishli malaka va amalga oshirish uchun vaqt talab qiladigan vazifalarga duch kelasiz. "G'ildirakni qayta ixtiro qilish" kerak emas. Biz uchun ko'p narsa allaqachon o'ylangan va yozilgan. Shunday qilib, biz yillar davomida sinovdan o'tgan narsadan foydalanamiz.

Java-da ma'lumotlarni saqlash

Keling, harakatni ko'rib chiqaylik. Java'da biz ushbu model uchun , , , maydonlari bilan Sharemaxsus sinf yaratdik . Va ko'plab aktsiyalar sifatida saqlangan , bu erda kalit har bir ulush uchun noyob identifikator hisoblanadi. namechangeProbabilitystartPricedeltaMap<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 orqali kerakli reklamaga kirish uchun usuldan foydalaning shares.get(id). Qimmatli qog'ozni nomi yoki narxi bo'yicha topish vazifasi uchun biz o'zimizga kerak bo'lgan narsani qidirib, barcha yozuvlarni aylanib chiqamiz va hokazo. Ammo biz boshqa yo'l bilan boramiz va qiymatlarni DBMSda saqlaymiz.

DBMSda ma'lumotlarni saqlash

Keling, ma'lumotlar bazasi uchun ma'lumotlarni saqlash qoidalarining dastlabki to'plamini tuzamiz:
  • Ma'lumotlar bazasidagi ma'lumotlar jadvallar ( JADVAL ) shaklida tuzilgan, ular yozuvlar to'plamidir.
  • Barcha yozuvlar bir xil maydonlar to'plamiga ega. Ular jadval yaratishda o'rnatiladi.
  • Maydon standart qiymatga o'rnatilishi mumkin ( DEFAULT ).
  • Jadval uchun siz ularning yaxlitligini ta'minlash uchun uning ma'lumotlariga qo'yiladigan talablarni tavsiflovchi cheklovlarni ( CONSTRAINT ) o'rnatishingiz mumkin. Buni jadval yaratish bosqichida amalga oshirish mumkin ( CREATE TABLE ) yoki keyinroq qo'shilishi mumkin ( ALTER TABLE ... ADD CONSTRAINT ).
  • Eng keng tarqalgan cheklov :
    • Birlamchi kalit - PRIMARY (bizning holatlarimizda Id).
    • Noyob qiymat maydoni UNIQUE (avtomobil jadvali uchun VIN).
    • CHECK maydonini tekshirish (foiz qiymati 100 dan oshmasligi kerak). Maydondagi shaxsiy cheklovlardan biri NOT NULL yoki NULL bo'lib , jadval maydonida NULLni saqlashni taqiqlaydi/ruxsat beradi.
    • Uchinchi tomon jadvaliga havola FOREIGN KEY (aksiya narxlari jadvalidagi aktsiyaga havola).
    • INDEX indeksi (undagi qiymatlarni qidirishni tezlashtirish uchun maydonni indekslash).
    • Yozuvni o'zgartirish ( INSERT , UPDATE ) agar uning maydonlarining qiymatlari cheklovlarga zid bo'lsa (CONSTRAINT) amalga oshirilmaydi.
  • Har bir jadvalda yozuvni yagona aniqlash uchun ishlatilishi mumkin bo'lgan kalit maydon (yoki bir nechta) bo'lishi mumkin. Bunday maydon (yoki maydonlar, agar ular kompozit kalitni tashkil qilsa) jadvalning asosiy kalitini tashkil qiladi - PRIMARY KEY .
    • Birlamchi kalit jadvaldagi yozuvning o'ziga xosligini ta'minlaydi, unda indeks yaratiladi, bu kalit qiymati asosida butun yozuvga tezkor kirish imkonini beradi.
    • Birlamchi kalitga ega bo'lish jadvallar o'rtasida havolalar yaratishni ancha osonlashtiradi. Keyinchalik, biz sun'iy asosiy kalitdan foydalanamiz: birinchi yozuv uchun id = 1har bir keyingi yozuv id qiymati birga ko'tarilgan holda jadvalga kiritiladi. Ushbu kalit ko'pincha AutoIncrement yoki AutoIdentity deb ataladi .
Aslida, aktsiyalar jadvali: 2-qism. DBMS tuzilishi, jadvallar va ma'lumotlar turlari - 2 Bu holda aktsiya nomini kalit sifatida ishlatish mumkinmi? Umuman olganda - ha, lekin ba'zi kompaniyalar turli xil aktsiyalarni chiqarishlari va ularni faqat o'z nomi bilan chaqirishlari mumkin. Bunday holda, endi o'ziga xoslik bo'lmaydi. Amalda, sun'iy asosiy kalit juda tez-tez ishlatiladi. Qabul qiling, odamlar yozuvlarini o'z ichiga olgan jadvalda to'liq ismni noyob kalit sifatida ishlatish noyoblikni ta'minlamaydi. Shuningdek, to'liq ism va tug'ilgan sananing kombinatsiyasidan foydalanish.

DBMSdagi ma'lumotlar turlari

Boshqa har qanday dasturlash tillari singari, SQL ham ma'lumotlarni yozishga ega. Bu erda eng keng tarqalgan SQL ma'lumotlar turlari: Butun sonlar turlari
SQL turi SQL sinonimlari Java tilida moslashish Tavsif
INT INT4, INTEGER java.lang.Integer 4 baytli butun son, -2147483648 … 2147483647
BUL BOOL, BIT java.lang.Boolean To'g'ri, yolg'on
TINYINT java.lang.Byte 1 baytlik butun son, -128 … 127
KICHIK INT2 java.lang.Qisqa 2 baytli butun son, -32768 … 32767
BIGINT INT8 java.lang.Long 8 baytlik butun son, -9223372036854775808 … 9223372036854775807
AUTO_INCREMENT OSHIRISH java.lang.Long Jadvalga xos bo'lgan qo'shimcha hisoblagich. Agar unga yangi qiymat kiritilsa, u bittaga ortadi.Yaratilgan qiymatlar hech qachon takrorlanmaydi.
Haqiqiy
SQL turi SQL sinonimlari Java tilida moslashish Tavsif
DECIMAL(N,M) DEC, NUMBER java.math.BigDecimal Ruxsat etilgan aniqlikdagi o'nlik (N butun son va M kasr raqam). Asosan moliyaviy ma'lumotlar bilan ishlash uchun mo'ljallangan.
DOUBLE FLOAT8 java.lang.Double Ikki marta aniqlikdagi haqiqiy raqam (8 bayt).
HAQIQIY FLOAT4 java.lang.Real Yagona aniqlikdagi haqiqiy raqam (4 bayt).
String
SQL turi SQL sinonimlari Java tilida moslashish Tavsif
VARCHAR(N) NVARCHAR java.lang.String N uzunlikdagi UNICODE qatori. Uzunlik 2147483647 bilan cheklangan. Satrning butun tarkibini xotiraga yuklaydi.
sana va vaqt
SQL turi SQL sinonimlari Java tilida moslashish Tavsif
TIME java.time.LocalTime, java.sql.Time Saqlash vaqti (nanosekundlargacha), DATETIME ga aylantirilganda, sana 1970 yil 1 yanvarga o'rnatiladi.
DATE java.time.LocalDate, java.sql.Timestamp Sanalarni yyyy-aa-dd formatida saqlash, vaqt 00:00 qilib belgilangan
DATETIME VAQT BORGASI java.time.LocalDateTime, java.sql.Timestamp Sana + vaqtni saqlash (vaqt zonalarini hisobga olmagan holda).
Katta hajmdagi ma'lumotlarni saqlash
SQL turi Java tilida moslashish Tavsif
BLOB java.io.InputStream, java.sql.Blob Ikkilik ma'lumotlarni saqlash (rasmlar, fayllar ...).
CLOB java.io.Reader, java.sql.Clob Katta matnli ma'lumotlarni (kitoblar, maqolalar...) saqlash VARCHARdan farqli o'laroq, ma'lumotlarni xotiraga qismlarga bo'lib yuklaydi.

SQL yozish uslubi

Ko'pgina tillar uchun kodni formatlash bo'yicha ko'rsatmalar mavjud. Odatda, bunday hujjatlarda o'zgaruvchilar, konstantalar, usullar va boshqa til tuzilmalarini nomlash qoidalari mavjud. Shunday qilib, Python uchun PEP8, Java uchun - Oracle Code Conventions for Java . SQL uchun bir necha xil to'plamlar yaratilgan, ular bir-biridan biroz farq qiladi. Qanday bo'lmasin, kodingizni formatlashda qoidalarga rioya qilish odatini rivojlantirishingiz kerak, ayniqsa siz jamoada ishlasangiz. Qoidalar, masalan, quyidagilar bo'lishi mumkin (albatta, siz o'zingiz uchun boshqa qoidalar to'plamini ishlab chiqishingiz mumkin, asosiysi kelajakda ularga rioya qilishdir):
  • Kalit so'zlar va zaxiralangan so'zlar, shu jumladan buyruqlar va operatorlar katta harflar bilan yozilishi kerak: CREATE TABLE, CONSTRAINT...
  • Jadvallar, maydonlar va boshqa ob'ektlarning nomlari SQL tilidagi kalit so'zlar bilan mos kelmasligi kerak (maqolaning oxiridagi havolaga qarang), lekin ularni o'z ichiga olishi mumkin.
  • Jadval nomlari ularning maqsadini aks ettirishi kerak. Ular kichik harflar bilan yozilgan. Ismdagi so'zlar bir-biridan pastki chiziq bilan ajratiladi. Oxiridagi so'z ko'plikda bo'lishi kerak : treyderlar (savdogarlar), share_rates (ulush kursi).
  • Jadval maydonlarining nomlari ularning maqsadini aks ettirishi kerak. Ular kichik harflar bilan yozilishi kerak, ismdagi so'zlar Camel Case uslubida formatlangan bo'lishi kerak va oxiridagi so'z birlikda ishlatilishi kerak : nom (nom), share_rates (ulush kursi).
  • Sun'iy kalit maydonlarida id so'zi bo'lishi kerak.
  • CONSTRAINT nomlari jadval nomlash qoidalariga amal qilishi kerak. Ular shuningdek, ulardagi maydonlar va jadvallarni o'z ichiga olishi kerak, semantik prefiks bilan boshlanishi kerak: check_ (maydon qiymatini tekshirish), pk_ (asosiy kalit), fk_ (tashqi kalit), uniq_ (maydonning yagonaligi), idx_ (indeks). Misol: pk_traider_share_actions_id (trader_share_actions jadvali uchun id maydonidagi asosiy kalit).
  • Va hokazo, siz SQLni o'rganganingizda, qoidalar ro'yxati to'ldiriladi/o'zgartiriladi.

DBMS dizayni

DBMS yaratishdan oldin darhol uni loyihalash kerak. Yakuniy sxemada jadvallar, maydonlar to'plami, CHAQLASH, kalitlar, maydonlar uchun standart shartlar, jadvallar va boshqa ma'lumotlar bazasi ob'ektlari o'rtasidagi munosabatlar mavjud. Internetda siz kichik DBMSlarni loyihalash uchun ko'plab bepul onlayn/oflayn dizaynerlarni topishingiz mumkin. Qidiruv tizimiga “Maʼlumotlar bazasi dizayneri bepul” kabi biror narsani yozib koʻring. Bunday ilovalar foydali qo'shimcha xususiyatlarga ega:
  • DBMS yaratish uchun SQL buyruqlarini yaratishi mumkin.
  • Diagrammadagi sozlamalarni vizual tarzda ko'rsating.
  • Yaxshiroq ko'rish uchun jadvallarni ko'chirish imkonini beradi.
  • Diagrammada kalitlarni, indekslarni, munosabatlarni, standart qiymatlarni va shunga o'xshashlarni ko'rsating.
  • Ular DBMS sxemasini masofadan saqlashlari mumkin.
Masalan, dbdiffo.com kalitlarni ajratib ko'rsatadi, bo'sh bo'lmagan maydonlarni va NN yorlig'i bilan AI (AutoIncrement) hisoblagichlarini ko'rsatadi:
2-qism. DBMS tuzilishi, jadvallar va ma'lumotlar turlari - 3

DBMSda jadvallar yaratish

Shunday qilib, bizda diagramma bor. Endi jadvallarni yaratishga o'tamiz (CREATE TABLE). Buning uchun bizda dastlabki ma'lumotlarga ega bo'lish tavsiya etiladi:
  • jadval nomi
  • maydon nomlari va turi
  • maydonlardagi cheklovlar (CHEKLAMALAR).
  • maydonlar uchun standart qiymatlar (agar mavjud bo'lsa)
  • agar mavjud bo'lsa, asosiy kalit (PRIMARY KEY).
  • jadvallar orasidagi ulanishlar (Xorijiy kalit)
Biz CREATE TABLE buyrug'ining barcha variantlarini batafsil o'rganmaymiz, treyderlar uchun jadval yaratish misolidan foydalanib, SQL asoslarini ko'rib chiqamiz:
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)
Keling, batafsil ko'rib chiqaylik:
  • CREATE TABLE traiders(maydon tavsifi) - ko'rsatilgan nom bilan jadval yaratadi, tavsifda maydonlar vergul bilan ajratiladi. Har qanday buyruq nuqtali vergul bilan tugaydi.
  • Maydon tavsifi uning nomidan boshlanadi, so'ngra uning turi, CONSTRAINT va standart qiymat.
  • id BIGINT AUTO_INCREMENT PRIMARY KEY– butun son tipidagi id maydoni asosiy kalit va qo‘shimcha hisoblagichdir (id maydoni uchun har bir yangi yozuv uchun ushbu jadval uchun avval yaratilganidan bir kattaroq qiymat hosil bo‘ladi).
  • cash DECIMAL(15,2) NOT NULL DEFAULT 1000– kassa maydoni, kasr, kasrdan oldin 15 ta va keyin ikkita raqam (moliyaviy ma'lumotlar, masalan, dollar va sent). NULL qiymatlarni qabul qilib bo'lmaydi. Agar qiymat berilmasa, u 1000 qiymatini oladi.
  • about VARCHAR(255) NULL- haqida maydoni, uzunligi 255 belgigacha bo'lgan qator bo'sh qiymatlarni qabul qilishi mumkin.
E'tibor bering, biz jadvalni yaratgandan so'ng CONSTRAINT shartlarining bir qismini o'rnatishimiz mumkin . Jadval strukturasini va uning maydonlarini o'zgartirish konstruktsiyasini ko'rib chiqamiz: ALTER TABLE table_name ADD COSTRAINT constraint_name CHECK (shart) misollar yordamida:
  • CHECK(tradingMethod IN (1,2,3))– tradingMethod maydoni faqat 1,2,3 qiymatlarini qabul qilishi mumkin
  • CHECK(changeProbability <= 100 AND changeProbability > 0)- o'zgartirish ehtimoli maydoni 1 dan 100 gacha bo'lgan butun son qiymatlarini olishi mumkin

Jadvallar o'rtasidagi munosabatlar

Jadvallar orasidagi munosabatlar tavsifini tahlil qilish uchun share_rates yaratishni ko'rib chiqamiz:
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)
2-qism. DBMS tuzilishi, jadvallar va ma'lumotlar turlari - 4
Boshqa jadvalning qiymatlariga havolani quyidagicha o'rnatish mumkin: ALTER TABLEjadval_qaysi_tasvirlangan ADD FOREIGN KEY(maydon_tasvirlangan) REFERENCESjadval_qaysi_yo'naltirilgan (maydon_tasvirlangan) aktsiyalarda bizda aktsiyalar bo'yicha yozuvlar mavjud bo'lsin , masalan, id=50 uchun Microsoft aksiyalarini boshlang'ich narxi bilan saqlaymiz. 17,5, delta 20 va o'zgarish ehtimoli 4%. Share_rates jadvali uchun biz uchta asosiy xususiyatni olamiz:
  • Aksiyalar jadvalidagi qolgan ma'lumotlarni (ism va boshqalarni) olish uchun foydalanish uchun biz faqat identifikatorning qiymatini ulushlar jadvalida saqlashimiz kerak.
  • Biz mavjud bo'lmagan reklama uchun tarif yarata olmaymiz. Ulanish maydoniga mavjud bo'lmagan qiymatni kirita olmaysiz (bu id bilan ulushlar jadvalida hech qanday yozuv yo'q), chunki jadvallar o'rtasida yozishmalar bo'lmaydi.
  • Tariflari share_rates boʻlimida oʻrnatilgan aktsiyalardagi ulush yozuvini oʻchira olmaymiz.
Oxirgi ikki nuqta saqlangan ma'lumotlarning yaxlitligini ta'minlash uchun xizmat qiladi. Maqolaning oxiridagi github omboriga havoladan foydalanib, tegishli sinflarning usullarini Java-da amalga oshirishda bizning emulyatsiyamizning SQL jadvallarini va SQL so'rovlari misollarini yaratishni ko'rishingiz mumkin. Uchinchi qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION