JavaRush /Java блогы /Random-KK /2-бөлім. ДҚБЖ құрылымы, кестелер және деректер түрлері
Marat Sadykov
Деңгей

2-бөлім. ДҚБЖ құрылымы, кестелер және деректер түрлері

Топта жарияланған
Бірінші бөлім
2-бөлім. ДҚБЖ құрылымы, кестелер және деректер түрлері – 1
Біз қарапайым қор биржасының эмуляторын жасауды жалғастырамыз. Міне, біз не істейміз:
  • Мәліметтер базасын ұйымдастыру диаграммасын құрайық.
  • Біз нені, қалай және қайда сақталатынын сипаттаймыз.
  • Мәліметтердің бір-бірімен байланысын анықтайық.
  • SQL тілінің CREATE TABLE , Data Definition Language ( DDL ) SQL кестесін жасау командасының мысалын пайдаланып SQL негіздерін үйренуді бастайық .
  • Java бағдарламасын жазуды жалғастырайық. Біз JDBC және үш деңгейлі архитектураны пайдалана отырып, біздің дерекқорды бағдарламалық түрде құру үшін java.sql тұрғысынан ДҚБЖ негізгі функцияларын жүзеге асырамыз.
Бұл екі бөлік неғұрлым көлемді болды, өйткені бізге SQL негіздерімен және ДҚБЖ ұйымдастыруымен іштен танысып, Java-мен ұқсастықтар жасау керек. Сізді code тізімдерімен жалықтырмау үшін, соңында бағдарламамен сәйкес commit github репозиторийіне сілтемелер бар.

ДҚБЖ дизайны

Қолданба сипаттамасы

Деректерді сақтауды ұйымдастыру бағдарламалаудың ажырамас бөлігі екенін естігенсіз. Естеріңізге сала кетейін, біздің қосымшамыздың мақсаты қарапайым алмасу эмуляциясы болып табылады:
  • Берілген ережелерге сәйкес құны сауда күні ішінде өзгеруі мүмкін акциялар бар;
  • бастапқы капиталы бар трейдерлер бар;
  • трейдерлер өз алгоритміне сәйкес акцияларды сатып алып, сата алады.
Биржа кенелермен жұмыс істейді - белгіленген уақыт кезеңдері (біздің жағдайда - 1 minutes). Кене кезінде акция бағасы өзгеруі мүмкін, содан кейін трейдер акцияларды сатып алуы немесе сатуы мүмкін.

Алмасу эмуляциясы деректер құрылымы

Жеке биржа субъектілерінің үлгілерін атайық. Дөңгелектеу қателерін болдырмау үшін біз қаржылық сомалармен сынып арқылы жұмыс істейміз BigDecimal(толық ақпаратты мақаланың соңындағы сілтемеден табуға болады). Әрбір модельдің құрылымын толығырақ сипаттайық: Науқан:
Атрибут Түр Сипаттама
name Srting Аты
changeProbability int Әр белгі бойынша пайыздық мөлшерлеменің өзгеру ықтималдығы
startPrice Үлкен ондық Бастапқы құн
delta int Ағымдағы мән өзгеруі мүмкін пайыздық мөлшерлеме
Акция бағасы:
Атрибут Түр Сипаттама
operDate LocalDateTime Тарифті орнату уақыты (белгі).
share Науқан Жарнамаға сілтеме
rate Үлкен ондық Акция бағасы
Трейдер:
Атрибут Түр Сипаттама
name Жол Тарифті орнату уақыты (белгі).
sfreqTick int Транзакциялардың жиілігі. Кезеңмен, кенелермен көрсетіледі, содан кейін трейдер операцияларды орындайды
cash Үлкен ондық Акциялардан басқа ақша сомасы
traidingMethod int Трейдер пайдаланатын алгоритм. Оны тұрақты сан ретінде орнатайық, алгоритмнің орындалуы Java codeында (келесі бөліктерде) болады.
changeProbability int Операцияның аяқталу ықтималдығы, пайыз
about Жол Әр белгі бойынша мөлшерлеменің өзгеру ықтималдығы, пайызбен
Трейдер әрекеттері:
Атрибут Түр Сипаттама
operation int Мәміле түрі (сатып алу немесе сату)
traider Трейдер Трейдер сілтемесі
shareRate Акция бағасы Акция бағасына сілтеме (тиісінше акцияның өзі, оның мөлшерлемесі және шығарылған уақыты)
amount Ұзақ Мәмілеге қатысқан акциялар саны
Әрбір модельдің бірегейлігін қамтамасыз ету үшін біз longid түрінің атрибутын қосамыз . Бұл төлсипат үлгі даналары ішінде бірегей болады және оны бірегей түрде анықтайды. Басқа үлгілерге сілтеме жасайтын атрибуттар (трейдер, акция, акция бағасы) осы үлгіні сәйкес үлгіні бірегей анықтау үшін пайдалана алады. Біз осындай деректерді сақтау үшін пайдалана аламыз деген ой бірден ойға келеді , сәйкес модель қайда. Дегенмен, оны келесі шарттарда codeта енгізіп көріңіз: idMap<Long, Object>Object
  • деректер көлемі қол жетімді ЖЖҚ көлемінен айтарлықтай асып түседі;
  • деректерге қол жеткізу оншақты жерден күтіледі;
  • деректерді бір уақытта өзгерту және оқу мүмкіндігі қажет;
  • деректердің қалыптасуы мен тұтастығын қамтамасыз ету ережелерін қамтамасыз ету қажет;
...және сізде тиісті біліктілік пен іске асыру үшін уақыт қажет болатын міндеттер болады. «Дөңгелекті қайта ойлап табудың» қажеті жоқ. Біз үшін көп нәрсе ойластырылған және жазылған. Сондықтан біз жылдар бойы сыналған нәрсені қолданамыз.

Java тілінде деректерді сақтау

Әрекетті қарастырайық. Java тілінде біз , , , 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). Акцияны атауы немесе бағасы бойынша табу тапсырмасы үшін біз қажеттісін іздейтін барлық жазбаларды айналдырамыз және т.б. Бірақ біз басқа жолмен жүреміз және мәндерді ДҚБЖ сақтаймыз.

ДҚБЖ-да мәліметтерді сақтау

ДҚБЖ үшін деректерді сақтау ережелерінің бастапқы жинағын құрастырайық:
  • ДҚБЖ деректері жазбалар жиыны болып табылатын кестелерге ( TABLE ) ұйымдастырылған.
  • Барлық жазбаларда бірдей өрістер жинағы болады. Олар кестені құру кезінде орнатылады.
  • Өрісті әдепкі мәнге орнатуға болады ( DEFAULT ).
  • Кесте үшін олардың тұтастығын қамтамасыз ету үшін оның деректеріне қойылатын талаптарды сипаттайтын шектеулерді ( CONSTRAINT ) орнатуға болады. Мұны кестені жасау кезеңінде орындауға болады ( CREATE TABLE ) немесе кейінірек қосуға болады ( ALTER TABLE ... ADD CONSTRAINT ).
  • Ең көп тараған ШЕКТЕУ :
    • Бастапқы кілт - PRIMARY (біздің жағдайда Id).
    • Бірегей мән өрісі UNIQUE (көлік кестесі үшін VIN).
    • CHECK өрісін тексеру (пайыздық мән 100-ден үлкен болмауы керек). Өрістегі жеке шектеулердің бірі NO NULL немесе NULL болып табылады , ол кесте өрісінде NULL мәнін сақтауға тыйым салады/рұқсат етеді.
    • Үшінші тарап кестесіне сілтеме FOREIGN KEY (акция бағалары кестесіндегі акцияға сілтеме).
    • INDEX индексі (ондағы мәндерді іздеуді жылдамdate үшін өрісті индекстеу).
    • Жазбаны өзгерту ( INSERT , UPDATE ) егер оның өрістерінің мәндері шектеулерге қайшы келсе (CONSTRAINT) болмайды.
  • Әрбір кестеде жазбаны бірегей анықтау үшін пайдаланылатын негізгі өріс (немесе бірнеше) болуы мүмкін. Мұндай өріс (немесе өрістер, егер олар құрама кілтті құраса) кестенің бастапқы кілтін құрайды - PRIMARY KEY .
    • Бастапқы кілт кестедегі жазбаның бірегейлігін қамтамасыз етеді, онда индекс құрылады, ол кілт мәніне негізделген бүкіл жазбаға жылдам қол жеткізуге мүмкіндік береді.
    • Бастапқы кілттің болуы кестелер арасындағы сілтемелерді жасауды айтарлықтай жеңілдетеді. Әрі қарай, біз жасанды бастапқы кілтті қолданамыз: бірінші жазба үшін id = 1әрбір келесі жазба id мәні бірге ұлғайтылған кестеге енгізіледі. Бұл кілт жиі AutoIncrement немесе AutoIdentity деп аталады .
Шын мәнінде, қорлар кестесі: 2-бөлім. ДҚБЖ құрылымы, кестелер және деректер түрлері – 2 Бұл жағдайда қор атауын кілт ретінде пайдалануға болады ма? Жалпы алғанда - иә, бірақ кейбір компаниялардың әртүрлі акциялар шығаруы және оларды тек өз атымен атауы мүмкін. Бұл жағдайда енді бірегейлік болмайды. Іс жүзінде жасанды бастапқы кілт жиі қолданылады. Келісіңіз, адамдардың жазбалары бар кестеде толық атауды бірегей кілт ретінде пайдалану бірегейлікті қамтамасыз етпейді. Сондай-ақ толық аты-жөні мен туған күні тіркесімін пайдалану.

ДҚБЖ-дағы деректер типтері

Кез келген басқа бағдарламалау тілі сияқты, SQL де деректерді теру мүмкіндігі бар. Мұнда ең көп таралған SQL деректер типтері берілген: Бүтін типтер
SQL түрі SQL синонимдері Java тіліндегі сәйкестік Сипаттама
INT INT4,INTEGER java.lang.Integer 4 byte бүтін сан, -2147483648 … 2147483647
БУЛИАН BOOL, BIT java.lang.Boolean Рас, өтірік
TINYINT java.lang.Byte 1 byte бүтін сан, -128 … 127
ҰШАҚ INT2 java.lang.Қысқа 2 byte бүтін сан, -32768 … 32767
ҮЛКЕН INT8 java.lang.Long 8 byte бүтін сан, -9223372036854775808 … 9223372036854775807
AUTO_INCREMENT ӨСІРУ java.lang.Long Кестеге ғана тән инкрементті есептегіш. Егер оған жаңа мән енгізілсе, ол біреуге артады. Жасалған мәндер ешқашан қайталанбайды.
Нағыз
SQL түрі SQL синонимдері Java тіліндегі сәйкестік Сипаттама
ОНДЫҚ(N,M) ЖЕЛТОҚСАН, NUMBER java.math.BigDecimal Бекітілген дәлдік ондық (N бүтін цифр және M бөлшек цифр). Негізінен қаржылық деректермен жұмыс істеуге арналған.
ҚОС FLOAT8 java.lang.Double Екі есе дәлдіктегі нақты сан (8 byte).
REAL FLOAT4 java.lang.Real Бір дәлдіктегі нақты сан (4 byte).
Жол
SQL түрі SQL синонимдері Java тіліндегі сәйкестік Сипаттама
ВАРЧАР(N) NVARCHAR java.lang.String Ұзындығы N UNICODE жолы. Ұзындығы 2147483647 шектелген Жолдың бүкіл мазмұнын жадқа жүктейді.
күні мен уақыты
SQL түрі SQL синонимдері Java тіліндегі сәйкестік Сипаттама
TIME java.time.LocalTime, java.sql.Time Сақтау уақыты (наносекундтарға дейін), DATETIME уақытына түрлендіру кезінде күн 1970 жылдың 1 қаңтарына орнатылады.
КҮН java.time.LocalDate, java.sql.Timestamp Күндерді жжжж-мм-кк пішімінде сақтау, уақыт 00:00 болып орнатылған
DATETIME УАҚЫТ БЕЛГІСІ java.time.LocalDateTime, java.sql.Timestamp Сақтау күні + уақыт (уақыт белдеулерін есепке алмай).
Мәліметтердің үлкен көлемін сақтау
SQL түрі Java тіліндегі сәйкестік Сипаттама
BLOB java.io.InputStream, java.sql.Blob Екілік деректерді сақтау (суреттер, файлдар...).
CLOB java.io.Reader, java.sql.Clob Үлкен мәтіндік деректерді (кітаптар, мақалалар...) сақтау VARCHAR-дан айырмашылығы, деректерді жадқа бөліктермен жүктейді.

SQL жазу стилі

Көптеген тілдер үшін codeты пішімдеу нұсқаулары бар. Әдетте мұндай құжаттарда айнымалыларды, тұрақтыларды, әдістерді және басқа тілдік құрылымдарды атау ережелері болады. Сонымен, Python үшін PEP8, Java үшін - Java үшін Oracle Code Conventions бар . SQL үшін бір-бірінен аздап ерекшеленетін бірнеше түрлі жинақтар жасалған. Қарамастан, codeты пішімдеу кезінде ережелерді сақтау әдетін дамыту керек, әсіресе командада жұмыс істесеңіз. Ережелер, мысалы, келесідей болуы мүмкін (әрине, сіз өзіңіз үшін басқа ережелер жинағын жасай аласыз, бастысы - болашақта оларды ұстану):
  • Кілт сөздер мен резервтелген сөздер, соның ішінде командалар мен операторлар бас әріптермен жазылуы керек: CREATE TABLE, COSTRAINT...
  • Кестелердің, өрістердің және басқа нысандардың атаулары SQL тілінің кілт сөздерімен сәйкес келмеуі керек (мақаланың соңындағы сілтемені қараңыз), бірақ оларды қамтуы мүмкін.
  • Кесте атаулары олардың мақсатын көрсетуі керек. Олар кіші әріптермен жазылады. Атаудағы сөздер бір-бірінен астын сызу арқылы бөлінеді. Соңындағы сөз көпше болуы керек : трейдерлер (трейдерлер), share_rates (акция мөлшерлемесі).
  • Кесте өрістерінің атаулары олардың мақсатын көрсетуі керек. Олар кіші әріптермен жазылуы керек, атаудағы сөздер Camel Case стилінде пішімделуі керек және соңында сөз жекеше түрде қолданылуы керек : аты (атауы), share_rates (pay rate).
  • Жасанды кілт өрістерінде id сөзі болуы керек.
  • CONSTRAINT атаулары кестені атау конвенцияларына сәйкес келуі керек. Олар сондай-ақ оларға қатысты өрістер мен кестелерді қамтуы керек, семантикалық префикстен басталуы керек: check_ (өріс мәнін тексеру), pk_ (бастапқы кілт), fk_ (сыртқы кілт), uniq_ (өріс бірегейлігі), idx_ (индекс). Мысал: pk_traider_share_actions_id (trader_share_actions кестесі үшін идентификатор өрісіндегі негізгі кілт).
  • Және т.б., сіз SQL тілін оқып жатқанда, ережелер тізімі толықтырылады/өзгертіледі.

ДҚБЖ дизайны

ДҚБЖ құрудың алдында бірден оны жобалау керек. Қорытынды схемада кестелер, өрістер жиыны, ШЕКТЕУ, кілттер, өрістерге арналған әдепкі шарттар, кестелер мен басқа дерекқор нысандары арасындағы байланыстар бар. Интернетте шағын ДҚБЖ жобалау үшін көптеген тегін онлайн/офлайн дизайнерлерді таба аласыз. Іздеу жүйесіне «Дерекқор дизайнері тегін» сияқты нәрсені теріп көріңіз. Мұндай қолданбалардың пайдалы қосымша қасиеттері бар:
  • ДҚБЖ жасау үшін SQL пәрмендерін жасай алады.
  • Диаграммадағы параметрлерді визуалды түрде көрсетіңіз.
  • Жақсырақ визуализация үшін кестелерді жылжытуға мүмкіндік береді.
  • Диаграммада кілттерді, индекстерді, қатынастарды, әдепкі мәндерді және т.б. көрсетіңіз.
  • Олар ДҚБЖ схемасын қашықтан сақтай алады.
Мысалы, dbdiffo.com кілттерді бөлектейді, бос емес өрістерді және NN белгісі бар AI (AutoIncrement) есептегіштерін көрсетеді:
2-бөлім. ДҚБЖ құрылымы, кестелер және деректер түрлері – 3

ДҚБЖ-да кестелерді құру

Сонымен бізде диаграмма бар. Енді кестелерді құруға көшейік (CREATE TABLE). Ол үшін бізде алдын ала деректер болған жөн:
  • кесте атауы
  • өріс атаулары мен түрі
  • өрістердегі шектеулер (ШЕКТЕУЛЕР).
  • өрістер үшін әдепкі мәндер (бар болса)
  • бар болса, бастапқы кілт (PRIMARY KEY).
  • кестелер арасындағы байланыс (СЫРТҚЫ КІЛТ)
Біз CREATE 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(өріс сипаттамасы) - көрсетілген атаумен кесте жасайды, сипаттамада өрістер үтірмен бөлінеді. Кез келген команда нүктелі үтірмен аяқталады.
  • Өріс сипаттамасы оның атауынан басталады, одан кейін оның түрі, ШЕКТЕУ және әдепкі мән.
  • id BIGINT AUTO_INCREMENT PRIMARY KEY– бүтін түрдегі id өрісі бастапқы кілт және қосымша есептегіш болып табылады (id өрісі үшін әрбір жаңа жазба үшін осы кесте үшін бұрын жасалғаннан бір үлкен мән жасалады).
  • cash DECIMAL(15,2) NOT NULL DEFAULT 1000– касса өрісі, ондық, үтірден бұрын 15 және одан кейінгі екі цифр (қаржылық деректер, мысалы, доллар және цент). NULL мәндерін қабылдау мүмкін емес. Ешбір мән берілмесе, ол 1000 мәнін алады.
  • about VARCHAR(255) NULL– туралы өрісі, ұзындығы 255 таңбаға дейінгі жол бос мәндерді қабылдай алады.
Кестені жасағаннан кейін ШЕКТЕУ шарттарының бір бөлігін орнатуға болатынын ескеріңіз . Кесте құрылымын және оның өрістерін өзгертуге арналған конструкцияны қарастырайық: ALTER TABLE кесте_атауы ADD CONSTRAINT шектеу_атауы 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-бөлім. ДҚБЖ құрылымы, кестелер және деректер түрлері – 4
Басқа кестенің мәндеріне сілтемені келесідей орнатуға болады: ALTER TABLEкесте_қайсысы_сілтеме ADD FOREIGN KEY(өріс_қайсы_сілтеме) REFERENCESкесте_қайсысына_сілтеме (өріс_қайсы_сілтеме) Акцияларда акциялар бойынша жазбалар бар, мысалы, id=50 үшін біз Microsoft акцияларын 17 бастапқы бағасымен сақтаймыз5. , дельта 20 және өзгеру мүмкіндігі 4%. Share_rates кестесі үшін біз үш негізгі сипатты аламыз:
  • Біз жай ғана бөлісу өрісінде бөлісулер кестесіндегі қалған ақпаратты (атын, т.б.) алу үшін пайдалану үшін тек id кілтінің мәнін бөлісулер кестесінен сақтауымыз керек.
  • Біз жоқ жарнама үшін тариф жасай алмаймыз. Бөліс өрісіне жоқ мәнді кірістіре алмайсыз (ол үшін осы идентификаторы бар ортақтар кестесінде жазба жоқ), өйткені кестелер арасында сәйкестік болмайды.
  • Тарифтері share_rates ішінде орнатылған акциялардағы бөлісу жазбасын жоя алмаймыз.
Соңғы екі нүкте сақталған деректердің тұтастығын қамтамасыз ету үшін қызмет етеді. Сіз мақаланың соңындағы github репозиторийіне сілтеме арқылы сәйкес сыныптардың әдістерін Java жүзеге асыруда біздің эмуляцияның SQL кестелерін және SQL сұрауларының мысалдарын құруды көре аласыз. Үшінші бөлім
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION