Бірінші бөлім
Біз қарапайым қор биржасының эмуляторын жасауды жалғастырамыз. Міне, біз не істейміз:
- Мәліметтер базасын ұйымдастыру диаграммасын құрайық.
- Біз нені, қалай және қайда сақталатынын сипаттаймыз.
- Мәліметтердің бір-бірімен байланысын анықтайық.
- 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та енгізіп көріңіз:
id
Map<Long, Object>
Object
- деректер көлемі қол жетімді ЖЖҚ көлемінен айтарлықтай асып түседі;
- деректерге қол жеткізу оншақты жерден күтіледі;
- деректерді бір уақытта өзгерту және оқу мүмкіндігі қажет;
- деректердің қалыптасуы мен тұтастығын қамтамасыз ету ережелерін қамтамасыз ету қажет;
...және сізде тиісті біліктілік пен іске асыру үшін уақыт қажет болатын міндеттер болады. «Дөңгелекті қайта ойлап табудың» қажеті жоқ. Біз үшін көп нәрсе ойластырылған және жазылған. Сондықтан біз жылдар бойы сыналған нәрсені қолданамыз.
Java тілінде деректерді сақтау
Әрекетті қарастырайық. Java тілінде біз , , ,
Share
өрістері бар осы үлгі үшін арнайы класс жасадық . Және көптеген акциялар ретінде сақталды , мұнда кілт әрбір үлес үшін бірегей идентификатор болып табылады.
name
changeProbability
startPrice
delta
Map<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 деп аталады .
Шын мәнінде, қорлар кестесі:
Бұл жағдайда қор атауын кілт ретінде пайдалануға болады ма? Жалпы алғанда - иә, бірақ кейбір компаниялардың әртүрлі акциялар шығаруы және оларды тек өз атымен атауы мүмкін. Бұл жағдайда енді бірегейлік болмайды. Іс жүзінде жасанды бастапқы кілт жиі қолданылады. Келісіңіз, адамдардың жазбалары бар кестеде толық атауды бірегей кілт ретінде пайдалану бірегейлікті қамтамасыз етпейді. Сондай-ақ толық аты-жөні мен туған күні тіркесімін пайдалану.
ДҚБЖ-дағы деректер типтері
Кез келген басқа бағдарламалау тілі сияқты, 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) есептегіштерін көрсетеді:
ДҚБЖ-да кестелерді құру
Сонымен бізде диаграмма бар. Енді кестелерді құруға көшейік (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)
Басқа кестенің мәндеріне сілтемені келесідей орнатуға болады:
ALTER TABLE
кесте_қайсысы_сілтеме
ADD FOREIGN KEY
(өріс_қайсы_сілтеме)
REFERENCES
кесте_қайсысына_сілтеме (өріс_қайсы_сілтеме)
Акцияларда акциялар бойынша жазбалар бар, мысалы, id=50 үшін біз Microsoft акцияларын 17 бастапқы бағасымен сақтаймыз5. , дельта 20 және өзгеру мүмкіндігі 4%.
Share_rates кестесі үшін біз үш негізгі сипатты аламыз:
- Біз жай ғана бөлісу өрісінде бөлісулер кестесіндегі қалған ақпаратты (атын, т.б.) алу үшін пайдалану үшін тек id кілтінің мәнін бөлісулер кестесінен сақтауымыз керек.
- Біз жоқ жарнама үшін тариф жасай алмаймыз. Бөліс өрісіне жоқ мәнді кірістіре алмайсыз (ол үшін осы идентификаторы бар ортақтар кестесінде жазба жоқ), өйткені кестелер арасында сәйкестік болмайды.
- Тарифтері share_rates ішінде орнатылған акциялардағы бөлісу жазбасын жоя алмаймыз.
Соңғы екі нүкте сақталған деректердің тұтастығын қамтамасыз ету үшін қызмет етеді. Сіз мақаланың соңындағы github репозиторийіне сілтеме арқылы сәйкес сыныптардың әдістерін Java жүзеге асыруда біздің эмуляцияның SQL кестелерін және SQL сұрауларының мысалдарын құруды көре аласыз.
Үшінші бөлім
GO TO FULL VERSION