JavaRush /Java блогу /Random-KY /2-бөлүк. DBMS түзүмү, таблицалар жана маалымат түрлөрү
Marat Sadykov
Деңгээл

2-бөлүк. DBMS түзүмү, таблицалар жана маалымат түрлөрү

Группада жарыяланган
Биринчи бөлүк
2-бөлүк. СУБД түзүмү, tableлар жана берorштердин түрлөрү - 1
Биз жөнөкөй биржа эмуляторубузду түзүүнү улантабыз. Бул жерде биз эмне кылабыз:
  • Берorштер базасын уюштуруу схемасын түзөлү.
  • Эмне, кантип жана кайда сакталганын сүрөттөп беребиз.
  • Берorштер бири-бири менен кандай байланышта экенин карап көрөлү.
  • SQL тorнин CREATE TABLE , Data Definition Language ( DDL ) тorнин SQL tableсын түзүү буйругунун мисалында SQLдин негиздерин үйрөнүп баштайлы .
  • Келгиле, Java программасын жазууну уланталы. Биз JDBC жана үч баскычтуу архитектураны колдонуу менен биздин маалымат базасын программалык түрдө түзүү үчүн Java.sql шартында СББнын негизги функцияларын ишке ашырабыз.
Бул эки бөлүк көбүрөөк көлөмдүү болуп чыкты, анткени биз SQLдин негиздери жана ички ДББны уюштуруу менен таанышып, Java менен аналогияларды тартышыбыз керек. Код тизмеси менен зерикпөө үчүн, аягында программа менен тиешелүү commit github репозиторийине шилтемелер бар.

DBMS дизайн

Колдонмо сүрөттөмөсү

Маалыматтарды сактоону уюштуруу программалоонун ажырагыс бөлүгү экенин сиз буга чейин уккансыз. Биздин колдонмонун максаты эң жөнөкөй алмашуу эмуляциясы экенин эскерте кетейин:
  • Берилген эрежелерге ылайык, соода күнүнүн ичинде наркы өзгөрүшү мүмкүн болгон акциялар бар;
  • баштапкы капиталы бар соодагерлер бар;
  • соодагерлер өз алгоритмине ылайык акцияларды сатып алып, сата алышат.
алмашуу кене иштейт - убакыттын белгиленген мөөнөттөрү (биздин учурда - 1 мүнөт). Кене учурунда акциянын баасы өзгөрүшү мүмкүн, андан кийин соодагер акцияларды сатып же сата алат.

Алмашуу эмуляция маалымат структурасы

Жеке биржа субъекттеринин моделдерин атайлы. Tagеректөө каталарын болтурбоо үчүн, биз класс аркылуу каржылык суммалар менен иштейбиз BigDecimal(деталдарды макаланын аягындагы шилтемеден тапса болот). Келгиле, ар бир моделдин түзүмүн кененирээк сүрөттөп берели: Промоушн:
Атрибут Type Description
name Srting аты
changeProbability int Ар бир кене боюнча пайыз катары курстун өзгөрүү ыктымалдыгы
startPrice BigDecimal Баштапкы чыгым
delta int Учурдагы маани өзгөрүшү мүмкүн болгон пайыздык максималдуу сумма
Акциянын баасы:
Атрибут Type Description
operDate LocalDateTime Бааны коюуга убакыт (белги).
share Жылдыруу Жарнамага шилтеме
rate BigDecimal Акциянын баасы
Соодагер:
Атрибут Type Description
name String Бааны коюуга убакыт (белги).
sfreqTick int Транзакциялардын жыштыгы. Мөөнөт менен көрсөтүлөт, кене менен, андан кийин соодагер операцияларды аткарат
cash BigDecimal Акциялардан башка акчанын суммасы
traidingMethod int соодагер тарабынан колдонулган алгоритм. Аны туруктуу сан катары коелу, алгоритмди ишке ашыруу Java codeунда (кийинки бөлүмдөрдө) болот
changeProbability int Операцияны аяктоо ыктымалдыгы, пайыз
about String Ар бир белги боюнча пайыздык көрсөткүчтүн өзгөрүү ыктымалдыгы
Соодагерлердин аракеттери:
Атрибут Type Description
operation int Бүтүмдүн түрү (сатып алуу же сатуу)
traider Trader Trader шилтемеси
shareRate Акциянын баасы Акциянын баасына шилтеме (тиешелүүлүгүнө жараша акциянын өзү, анын курсу жана чыгарылган убактысы)
amount Long Бүтүмгө катышкан акциялардын саны
Ар бир моделдин уникалдуулугун камсыз кылуу үчүн longid тибинин атрибутун кошобуз . Бул атрибут үлгү инстанцияларында уникалдуу болот жана аны уникалдуу аныктайт. Башка моделдерге шилтеме берген атрибуттар (трейдер, акция, акциялардын баасы) муну ылайыктуу моделди уникалдуу аныктоо үчүн колдоно алат. Ошол замат биз мындай маалыматтарды сактоо үчүн колдоно алабыз деген ой келет , бул жерде тиешелүү модель. Бирок, төмөнкү шарттарда муну codeдо ишке ашырууга аракет кылыңыз: idMap<Long, Object>Object
  • маалыматтардын көлөмү жеткorктүү RAM көлөмүнөн кыйла ашат;
  • маалыматтарга жетүү ондогон ар кандай жерлерден күтүлүүдө;
  • маалыматтарды бир эле учурда өзгөртүү жана окуу мүмкүнчүлүгү талап кылынат;
  • маалыматтарды түзүүнүн жана бүтүндүгүнүн эрежелерин камсыз кылуу зарыл;
...жана сиз тийиштүү квалификацияны жана ишке ашыруу үчүн убакытты талап кылган милдеттерге туш болосуз. "Дөңгөлөктү кайра ойлоп табуунун" кереги жок. Биз үчүн мурунтан эле көп нерсе ойлонулуп, жазылган. Ошентип, биз буга чейин көп жылдар бою сыналган нерсени колдонобуз.

Javaда маалыматтарды сактоо

Келгиле, иш-аракетти карап көрөлү. Java тorнде биз , , , талаалары Shareменен бул модель үчүн атайын класс түздүк . Жана көптөгөн үлүштөр катары сакталган , мында ачкыч ар бир үлүш үчүн уникалдуу идентификатор болуп саналат. 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 аркылуу каалаган жарнамага жетүү үчүн, ыкмасын колдонуңуз shares.get(id). Акцияны аты же баасы боюнча табуу тапшырмасы үчүн биз керектүүсүн издеп бардык жазууларды карап чыгабыз жана башкалар. Бирок биз башка жол менен барабыз жана баалуулуктарды DBMSде сактайбыз.

Берorштерди СДБСда сактоо

Келгиле, DBMS үчүн маалыматтарды сактоо эрежелеринин алгачкы топтомун түзөлү:
  • ДББдагы маалыматтар жазуулардын жыйындысы болгон tableларга ( tableга ) уюштурулган.
  • Бардык жазуулар бирдей талаалар топтомуна ээ. Алар үстөлдү түзүүдө коюлат.
  • Талааны демейки мааниге коюуга болот ( DEFAULT ).
  • Таблица үчүн анын берorштерине талаптарды сүрөттөгөн чектөөлөрдү ( CONSTRAINT ) орното аласыз, алардын бүтүндүгүн камсыз кылуу үчүн. Бул table түзүү стадиясында жасалышы мүмкүн ( CREATE TABLE ) же кийинчерээк кошулат ( ALTER TABLE ... ADD CONSTRAINT ).
  • Эң кеңири таралган ЧЕКТЕУ :
    • Негизги ачкыч PRIMARY (биздин учурда Id).
    • Уникалдуу маани талаасы UNIQUE (автоунаа tableсы үчүн VIN).
    • CHECK талаасы текшерилүүдө (пайыздык маани 100дөн жогору болбошу керек). Талаадагы жеке чектөөлөрдүн бири NO NULL же NULL болуп саналат , ал table талаасында NULLди сактоого тыюу салат/жол берет.
    • Үчүнчү тараптын tableсына шилтеме FOREIGN KEY (акциялардын баасынын tableсында акцияга шилтеме).
    • Index INDEX (андагы маанилерди издөөнү тездетүү үчүн талааны индекстөө).
    • Жазууну өзгөртүү ( INSERT , UPDATE ) эгерде анын талааларынын маанилери чектөөлөргө карама-каршы келсе (CONSTRAINT) болбойт.
  • Ар бир tableда жазууну уникалдуу аныктоо үчүн колдонула турган негизги талаа (же бир нече) болушу мүмкүн. Мындай талаа (же талаалар, эгерде алар курама ачкычты түзсө) tableнын негизги ачкычын түзөт - PRIMARY KEY .
    • Негизги ачкыч tableдагы жазуунун уникалдуулугун камсыздайт, анда индекс түзүлөт, ал ачкычтын мааниси боюнча бүт жазууга тез жетүүгө мүмкүндүк берет.
    • Негизги ачкычка ээ болуу tableлардын ортосундагы байланыштарды түзүүнү бир топ жеңилдетет. Андан кийин, биз жасалма негизги ачкычты колдонобуз: биринчи жазуу үчүн id = 1ар бир кийинки жазуу id мааниси бирге көбөйтүлгөн tableга киргизилет. Бул ачкыч көбүнчө AutoIncrement же AutoIdentity деп аталат .
Чынында, акциялардын tableсы: 2-бөлүк. СУБД түзүмү, tableлар жана берorштердин түрлөрү - 2 Бул учурда запастын атын ачкыч катары колдонууга болобу? Жалпысынан алганда - ооба, бирок кээ бир компания ар кандай акцияларды чыгарып, аларды өз аты менен гана аташы мүмкүн. Бул учурда, мындан ары уникалдуу болбойт. Иш жүзүндө, жасалма негизги ачкыч абдан көп колдонулат. Макул, адамдардын жазууларын камтыган tableда толук атын уникалдуу ачкыч катары колдонуу уникалдуулукту камсыз кылbyte. Ошондой эле толук аты-жөнүн жана туулган күнүн айкалыштыруу менен.

DBMSдеги маалымат түрлөрү

Башка программалоо тor сыяктуу эле, SQL да маалыматтарды терүү мүмкүнчүлүгүнө ээ. Бул жерде эң кеңири таралган SQL маалымат түрлөрү: Бүтүн сандар түрлөрү
SQL түрү SQL синонимдери Java тorнде дал келүү Description
INT INT4,INTEGER java.lang.Integer 4-byte бүтүн, -2147483648 … 2147483647
BOOLEAN BOOL, BIT java.lang.Boolean Чын, жалган
TINYINT java.lang.Byte 1-byte бүтүн, -128 … 127
SMALLINT INT2 java.lang.Short 2-byte бүтүн, -32768 … 32767
BIGINT INT8 java.lang.Long 8-byte бүтүн сан, -9223372036854775808 … 9223372036854775807
AUTO_INCREMENT КӨБӨЙТҮҮ java.lang.Long Таблицага уникалдуу кошумча эсептегич. Эгерде ага жаңы маани киргизилсе, анда ал бир көбөйөт. Түзүлгөн маанилер эч качан кайталанbyte.
Реал
SQL түрү SQL синонимдери Java тorнде дал келүү Description
ОНДУК (N,M) ДЕК, NUMBER java.math.BigDecimal Туруктуу тактык ондук (N бүтүн сан жана M бөлчөк сан). Негизинен каржылык маалыматтар менен иштөө үчүн иштелип чыккан.
DOUBLE FLOAT8 java.lang.Double Эки тактык реалдуу сан (8 byte).
REAL FLOAT4 java.lang.Real Бир тактык реалдуу сан (4 byte).
String
SQL түрү SQL синонимдери Java тorнде дал келүү Description
ВАРЧАР(N) NVARCHAR java.lang.String UNICODE сап N узундугу. Узундугу 2147483647 менен чектелген Саптын бардык мазмунун эс тутумга жүктөйт.
датасы жана убактысы
SQL түрү SQL синонимдери Java тorнде дал келүү Description
TIME java.time.LocalTime, java.sql.Time Сактоо убактысы (наносекундтарга чейин), DATETIMEга конвертациялоодо дата 1970-жылдын 1-январына коюлат.
DATE java.time.LocalDate, java.sql.Timestamp Даталарды yyyy-mm-gg форматында сактоо, убакыт 00:00 болуп коюлган
ДАТА УБАКЫТ УБАКЫТ БЕРГИСИ java.time.LocalDateTime, java.sql.Timestamp Сактоо күнү + убакыт (саат алHowтарын эсепке албастан).
Маалыматтын чоң көлөмүн сактоо
SQL түрү Java тorнде дал келүү Description
ТАМЧЫ java.io.InputStream, java.sql.Blob бинардык маалыматтарды сактоо (сүрөттөр, файлдар...).
CLOB java.io.Reader, java.sql.Clob Чоң тексттик маалыматтарды (китептер, макалалар...) сактоо VARCHARдан айырмаланып, маалыматтарды эстутумга бөлүктөр менен жүктөйт.

SQL жазуу стor

Көптөгөн тилдер үчүн codeду форматтоо боюнча көрсөтмөлөр бар. Эреже катары, мындай documentтер өзгөрмөлөрдү, константаларды, методдорду жана башка тилдик структураларды атоо эрежелерин камтыйт. Ошентип, Python үчүн PEP8, Java үчүн - Java үчүн Oracle Code Conventions бар . SQL үчүн бир нече түрдүү топтомдор түзүлдү, алар бири-биринен бир аз айырмаланат. Кандай болбосун, codeуңузду форматтоодо эрежелерди сактоо адатын өрчүтүшүңүз керек, өзгөчө командада иштесеңиз. Эрежелер, мисалы, төмөндөгүлөр болушу мүмкүн (албетте, сиз өзүңүз үчүн башка эрежелерди иштеп чыга аласыз, эң негизгиси келечекте аларды кармануу):
  • Ачкыч сөздөр жана сакталган сөздөр, анын ичинде командалар жана операторлор баш тамгалар менен жазылууга тийиш: CREATE TABLE, CONSTRAINT...
  • Таблицалардын, талаалардын жана башка an objectтердин аттары SQL тorнин ачкыч сөздөрү менен дал келбеши керек (макаланын аягындагы шилтемени караңыз), бирок аларды камтышы мүмкүн.
  • Таблица аттары алардын максатын чагылдырышы керек. Алар кичине тамгалар менен жазылган. Аттагы сөздөр бири-биринен астынкы сызык менен ажыратылат. Аягындагы сөз көптүк санда болушу керек : соодагерлер (трейдерлер), share_rates (pay курсу).
  • Таблица талаасынын аталыштары алардын максатын чагылдырышы керек. Алар кичине тамгалар менен жазылышы керек, аталыштагы сөздөр Camel Case стorнде форматталышы керек жана аягындагы сөз жекече колдонулушу керек : аты (аты), share_rates (pay ставкасы).
  • Жасалма ачкыч талааларында id деген сөз болушу керек.
  • CONSTRAINT аталыштары tableнын атоо конвенцияларына ылайык келиши керек. Алар ошондой эле аларга тартылган талааларды жана tableларды камтышы керек, семантикалык префикс менен башталышы керек: check_ (талаанын маанисин текшерүү), pk_ (негизги ачкыч), fk_ (чет өлкөлүк ачкыч), uniq_ (талаанын уникалдуулугу), idx_ (индекс). Мисал: pk_traider_share_actions_id (trader_share_actions tableсы үчүн id талаасындагы негизги ачкыч).
  • Жана башкалар, сиз SQLди үйрөнгөн сайын, эрежелердин тизмеси толукталат/өзгөртүлөт.

DBMS дизайн

DBMS түзүүдөн мурун, аны иштеп чыгуу керек. Акыркы схемада tableлар, талаалардын жыйындысы, КОНСТРАИНТ, ачкычтар, талаалар үчүн демейки шарттар, tableлар жана башка маалыматтар базасынын an objectтеринин ортосундагы мамилелер бар. Интернетте сиз чакан DBMSлерди долбоорлоо үчүн көптөгөн акысыз онлайн/офлайн дизайнерлерин таба аласыз. Издөө системасына "Маалымат базасынын дизайнери бекер" сыяктуу нерсени терип көрүңүз. Мындай колдонмолор пайдалуу кошумча касиеттерге ээ:
  • DBMS түзүү үчүн SQL буйруктарын түзө алат.
  • Диаграммадагы орнотууларды визуалдык түрдө көрсөтүңүз.
  • Жакшыраак визуалдаштыруу үчүн үстөлдөрдү жылдырууга мүмкүндүк берет.
  • Ачкычтарды, индекстерди, мамилелерди, демейки маанилерди жана ушул сыяктууларды диаграммада көрсөтүңүз.
  • Алар DBMS схемасын алыстан сактай алышат.
Мисалы, dbdiffo.com ачкычтарды бөлүп көрсөтөт, бош эмес талааларды жана NN энбелгиси бар AI (AutoIncrement) эсептегичтерин көрсөтөт:
2-бөлүк. СУБД түзүмү, tableлар жана берorштердин түрлөрү - 3

МБЖда tableларды түзүү

Ошентип, биз диаграмма бар. Эми tableларды түзүүгө өтөбүз (CREATE TABLE). Бул үчүн, алдын ала маалыматтарга ээ болушубуз керек:
  • столдун аты
  • талаа аттары жана түрү
  • талаалардагы чектөөлөр (CONSTRAINTS).
  • талаалар үчүн демейки маанилер (эгерде бар болсо)
  • негизги ачкыч (PRIMARY KEY).
  • tableлардын ортосундагы байланыштар (FOREIGN KEY)
Биз CREATE TABLE буйругунун бардык варианттарын майда-чүйдөсүнө чейин изилдебейбиз, биз соодагерлер үчүн table түзүү мисалында SQL негиздерин карап чыгабыз:
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)
Келгиле, кененирээк карап көрөлү:
  • CREATE TABLE traiders(талаанын сүрөттөлүшү) - көрсөтүлгөн аталыштагы tableны түзөт, сыпаттамада талаалар үтүр менен ажыратылат. Ар кандай буйрук чекиттүү үтүр менен аяктайт.
  • Талаанын сүрөттөлүшү анын аты менен башталат, андан кийин анын түрү, CONSTRAINT жана демейки маани.
  • id BIGINT AUTO_INCREMENT PRIMARY KEY– бүтүн сан түрүндөгү id талаасы негизги ачкыч жана кошумча эсептегич (id талаасы үчүн ар бир жаңы жазуу үчүн бул table үчүн мурда түзүлгөндөн бир чоңураак маани түзүлөт).
  • cash DECIMAL(15,2) NOT NULL DEFAULT 1000– касса талаасы, ондук, ондук чекиттин алдында 15 жана андан кийин эки цифра (финансылык маалыматтар, мисалы, доллар жана цент). NULL маанилерди кабыл алуу мүмкүн эмес. Эгер эч кандай маани берилбесе, ал 1000 маанисин алат.
  • about VARCHAR(255) NULL– жөнүндө талаасы, узундугу 255 белгиге чейинки сап бош маанилерди кабыл алат.
Таблицаны түзгөндөн кийин CONSTRAINT шарттарынын бир бөлүгүн орното аларыбызды эске алыңыз . Келгиле, table структурасын жана анын талааларын өзгөртүү үчүн конструкцияны карап көрөлү: ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK (шарт) мисалдарды колдонуу менен:
  • CHECK(tradingMethod IN (1,2,3))- tradingMethod талаасы 1,2,3 маанилерин гана ала алат
  • CHECK(changeProbability <= 100 AND changeProbability > 0)– өзгөртүү ыктымалдыгы талаасы 1ден 100гө чейинки диапазондо бүтүн сандарды ала алат

Таблицалардын ортосундагы байланыштар

Таблицалардын ортосундагы мамилелердин сүрөттөлүшүн талдоо үчүн, 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)
2-бөлүк. СУБД түзүмү, tableлар жана берorштердин түрлөрү - 4
Башка tableнын маанилерине шилтеме төмөнкүчө орнотулушу мүмкүн: ALTER TABLEtable_кайсысы_кайсысына_шилтемеленген ADD FOREIGN KEY(кайсысы_кайсысы_кайсысына_шилтемеленген) REFERENCEStable_кайсысына_шилтемеленген (кайсы_талаанын_кайсысы_шилтемеленген) Акцияларда бизде акциялар боюнча жазуулар бар, мисалы, id=50 үчүн биз Microsoft акцияларынын баштапкы баасы менен сактайбыз15. , дельта 20 жана 4% өзгөрүү мүмкүнчүлүгү. Share_rates tableсы үчүн биз үч негизги касиетти алабыз:
  • Биз жөн гана үлүштөр tableсында калган маалыматты (аты ж.
  • Болбогон жылдыруу үчүн тарифти түзө албайбыз. Бөлүшүү талаасына жок маанини киргизе албайсыз (бул идентификатор менен үлүштөр tableсында эч кандай жазуу жок), анткени tableлардын ортосунда эч кандай корреспонденция болбойт.
  • Баалар share_rates ичинде белгиленген үлүштөрдөгү бөлүшүү жазуусун жок кыла албайбыз.
Акыркы эки пункт сакталган маалыматтардын бүтүндүгүн камсыз кылуу үчүн кызмат кылат. Макаланын аягындагы github репозиторийине шилтеме аркылуу тиешелүү класстардын методдорун Java ишке ашырууда биздин эмуляциянын SQL tableларын жана SQL сурамдарынын мисалдарын түзүүнү көрө аласыз. Үчүнчү бөлүк
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION