SQL, he aha te mea ngawari ake? Ka taea e ia o taatau te tuhi i tetahi tono ngawari - ka pato taatau tīpako, whakarārangihia ngā tīwae e hiahiatia ana, kātahi i, ingoa tepu, etahi tikanga i roto te wahi katahi ano - ko nga raraunga whaihua kei roto i ta maatau pute, a (tata) ahakoa ko wai te DBMS kei raro i te awhi i tera wa (mehemea pea
A kia timata tika mai
Mahere ahanoa-hononga
Ko nga kaitautoko ORM e whakanui ana i te tere me te ngawari o te whakawhanaketanga, te motuhake mai i te DBMS me te waehere ma. Mo te nuinga o tatou, ko te waehere mo te mahi me te papaaarangi (me te nuinga o te waa ko te papaaarangi ake)
he penei te ahua...
@Entity
@Table(name = "stock", catalog = "maindb", uniqueConstraints = {
@UniqueConstraint(columnNames = "STOCK_NAME"),
@UniqueConstraint(columnNames = "STOCK_CODE") })
public class Stock implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "STOCK_ID", unique = true, nullable = false)
public Integer getStockId() {
return this.stockId;
}
...
Kei te whakairihia te tauira me nga korero mohio, a, kei muri i nga whakaaturanga he ORM maia te whakaputa me te mahi i etahi taranata o etahi waehere SQL. Ma te ara, kei te ngana nga kaiwhakawhanake ki te wehe i a raatau mai i o raatau papaa raraunga me nga kiromita o te tangohanga, e tohu ana etahi
I tera taha o nga parepare, ko nga kaiwhaiwhai o te SQL "hangaia-a-ringa" ka kite i te kaha ki te kohi i nga wai katoa mai i a raatau DBMS kaore he taapiri me nga tangohanga. Ko te mutunga mai, ka puta mai nga kaupapa "raraunga-raunga", kei reira nga tangata kua whakangungua motuhake ki roto i te paataka raraunga (he "tangata" ano ratou, he "tangata" ano, he "basdeners", me etahi atu), me nga kaihanga. me "toia" nga tirohanga kua rite me nga tikanga rongoa, me te kore e uru ki nga korero.
He aha mehemea kei a tatou te pai o nga ao e rua? Me pehea te mahi i roto i tetahi taputapu whakamiharo me te ingoa whakapumau i te ora
He reo hauhautanga a Clojure mo te hanga DSL, engari ko te SQL ake he DSL hauhautanga, kaore e hiahiatia tetahi atu. He rawe nga korero-S, engari karekau he taapiri hou ki konei. Ko te mutunga, ka whiwhi tatou i nga taiapa mo te pai o nga taiapa. Kaore koe e whakaae? Na ka tatari mo te wa ka timata te tangohanga i runga i te paataka korero ka timata koe ki te whawhai me te mahi (raw-sql)
Na me aha ahau? Waiho a SQL hei SQL auau - kotahi te konae mo ia tono:
-- name: users-by-country
select *
from users
where country_code = :country_code
... ka panui i tenei konae, ka huri hei mahi Clojure auau:
(defqueries "some/where/users_by_country.sql"
{:connection db-spec})
;;; A function with the name `users-by-country` has been created.
;;; Let's use it:
(users-by-country {:country_code "GB"})
;=> ({:name "Kris" :country_code "GB" ...} ...)
Ma te piri ki te kaupapa "SQL anake, Clojure ano" ka whiwhi koe:
- No ohorere syntactic. Ko to papaunga raraunga (penei i etahi atu) kaore i te 100% e tika ana ki te paerewa SQL - engari kaore he take mo Yesql. E kore koe e moumou taima ki te hopu mo nga mahi me te syntax rite SQL. E kore koe e hoki ki te mahi (raw-sql "etahi('funky'::SYNTAX)")).
- tautoko ētita pai. He tino pai te tautoko SQL o to kaiwhakatika. Ma te tiaki i te SQL hei SQL ka taea e koe te whakamahi noa.
- Te hototahi a te roopu. Ka taea e o DBA te panui me te tuhi i te SQL e whakamahia ana e koe i roto i to kaupapa Clojure.
- He ngawari ake te mahi whakatikatika. Me hanga mahere mo te patai raruraru? Ehara tenei i te raruraru ina he SQL auau to patai.
- Te whakamahi ano i nga patai. Tōia me te tuku i aua konae SQL ki etahi atu kaupapa na te mea he SQL tawhito noa - tohatoha noa.
Ki taku whakaaro, he tino hauhautanga te whakaaro, i te wa ano he tino ngawari, na te mea he maha nga whiwhinga o te kaupapa
Kaiwhakahaere IDE & DB
Me timata ma te mahi ngawari o ia ra. I te nuinga o nga wa me rapu tatou i etahi mea kei roto i te paataka raraunga, hei tauira, kimihia he ripanga i roto i te aronuinga me te ako i tona hanganga (he aha nga pou, nga taviri, nga taurangi, nga here, me etahi atu e whakamahia ana). A, mai i tetahi IDE whakairoiro, he kaiwhakahaere-DB iti ranei, ko te tuatahi, e tumanako ana matou ki enei kaha. Kia tere ai, kaore koe e tatari mo te hawhe haora kia tae mai ra ano he matapihi me nga korero e tika ana (ina koa me te hononga puhoi ki te papaaarangi mamao), me te wa ano, he hou, he tika hoki nga korero kua tae mai, me te kore keteroki paraurehe. I tua atu, ka nui ake te uaua me te nui o te papaa raraunga me te nui ake o te maha o ratou, ka uaua ake te mahi i tenei.
Engari i te nuinga o te wa ka makahia e ahau te kiore ka tuhi noa i te waehere. Me kii me rapu koe he aha nga ripanga (me nga taonga) kei roto i te kaupapa "HR". I te nuinga o nga DBMS, ka taea te whakatutuki i te hua e hiahiatia ana ma tenei patai ngawari mai i te information_schema:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
Mai i te patengi raraunga ki te patengi raraunga, he rereke nga ihirangi o aua ripanga tohutoro i runga i nga kaha o ia DBMS. A, hei tauira, mo MySQL, mai i te pukapuka tohutoro ano ka taea e koe te tiki i nga tawhā ripanga mo tenei DBMS:
select table_name
, storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
, row_format -- Формат строки ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
Kaore a Oracle e mohio ki nga korero_schema, engari kei a ia
select table_name
, pct_free -- Минимум свободного места в блоке данных (%)
, pct_used -- Минимум используемого места в блоке данных (%)
, last_analyzed -- Дата последнего сбора статистики
, ...
from all_tables
where owner = 'HR'
Ko ClickHouse he mea rereke:
select name
, engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
Ka taea te mahi penei i Cassandra (he columnfamilies hei utu mo nga ripanga me nga mokowākohi hei utu mo nga aronuinga):
select columnfamily_name
, compaction_strategy_class -- Стратегия сборки мусора
, gc_grace_seconds -- Время жизни мусора
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
Mo te nuinga atu o nga papaa raraunga, ka taea ano e koe te whakaputa mai i nga patai penei (ara Mongo
Ko te tikanga, ma tenei ka taea e koe te tiki korero mo nga tepu anake, engari mo nga mea katoa. Mai i tera wa ki tera wa, ka tohatoha nga tangata atawhai i taua waehere mo nga papaa raraunga rereke, penei, hei tauira, i roto i te raupapa o nga tuhinga habra "Nga Mahi mo te tuhi i nga papaarangi PostgreSQL" (
Ko te mutunga, ko tenei tikanga mo te whakatere me te rapu taonga he tino ngawari, he nui te penapena o te waa, ka taea e koe te tiki i nga korero i roto i te ahua e tika ana inaianei (penei, hei tauira, kua whakaahuahia i roto i te pou.
Nga mahi me nga taonga
I muri i to maatau kitenga me te ako i nga mea e tika ana, kua tae ki te wa ki te mahi i tetahi mea whai hua ki a raatau. Ko te tikanga, me te kore e tangohia o maihao mai i te papapātuhi.
Ehara i te mea ngaro ko te whakakore noa i te ripanga ka rite te ahua i roto i nga papaa raraunga katoa:
drop table hr.persons
Engari na te hanganga o te tepu ka pai ake. Tata ki nga DBMS (tae atu ki te maha o NoSQL) ka taea te "hanga tepu" i tetahi ahua, i tetahi atu ahua, a ko te waahanga matua ka rereke noa (ingoa, rarangi o nga pou, momo raraunga), engari ko etahi atu korero ka rereke te rereke me te whakawhirinaki ki te taputapu o roto me nga kaha o te DBMS motuhake. Ko taku tauira tino pai kei roto i nga tuhinga Oracle he "tahanga" BNF anake mo te "hanga tepu" wetereo
Ano, he maha nga DBMS kei a raatau ake momo momo taonga kaore i te waatea i etahi atu DBMS. I tua atu, ka taea e tatou te mahi i nga mahi kaore i runga i nga taonga papaaarangi, engari i runga ano i te DBMS ano, hei tauira, "whakamatea" he tukanga, ka wewete i etahi waahi mahara, ka taea te rapu, te huri ki te aratau "panui anake", me te maha atu.
Inaianei me tuhi iti
Ko tetahi o nga mahi tino noa ko te hanga hoahoa me nga taonga papaa raraunga me te kite i nga taonga me nga hononga i waenga i a raatau i roto i tetahi pikitia ataahua. Tata ki nga IDE kauwhata, nga taputapu "raina whakahau" motuhake, nga taputapu whakairoiro motuhake me nga tauira ka taea tenei. Ka tuhia e ratou tetahi mea mo koe "i nga mea e taea ana e ratou," ka taea e koe te awe i tenei tukanga he iti noa ma te awhina o etahi tawhā i roto i te konae whirihoranga, pouakataki ranei i te atanga.
Engari ka taea te whakatau i tenei raru he maamaa ake, he maamaa me te huatau, me te tikanga me te awhina o te waehere. Hei hanga hoahoa o nga mea uaua, he maha nga reo tohu motuhake (DOT, GraphML me etahi atu), a ma ratou he marara katoa o nga tono (GraphViz, PlantUML, Mermaid) ka taea te panui i aua tohutohu me te tiro ki roto i nga momo whakatakotoranga. . Ana, kua mohio tatou ki te tiki korero mo nga taonga me nga hononga i waenga i a raatau.
Anei tetahi tauira iti o te ahua o tenei, ma te whakamahi PlantUML me
select '@startuml'||chr(10)||'hide methods'||chr(10)||'hide stereotypes' union all
select distinct ccu.table_name || ' --|> ' ||
tc.table_name as val
from table_constraints as tc
join key_column_usage as kcu
on tc.constraint_name = kcu.constraint_name
join constraint_column_usage as ccu
on ccu.constraint_name = tc.constraint_name
where tc.constraint_type = 'FOREIGN KEY'
and tc.table_name ~ '.*' union all
select '@enduml'
A, ki te tamata koe i te iti, ka i runga i
He uaua ake te patai SQL
-- Шапка
select '@startuml
!define Table(name,desc) class name as "desc" << (T,#FFAAAA) >>
!define primary_key(x) <b>x</b>
!define unique(x) <color:green>x</color>
!define not_null(x) <u>x</u>
hide methods
hide stereotypes'
union all
-- Таблицы
select format('Table(%s, "%s n information about %s") {'||chr(10), table_name, table_name, table_name) ||
(select string_agg(column_name || ' ' || upper(udt_name), chr(10))
from information_schema.columns
where table_schema = 'public'
and table_name = t.table_name) || chr(10) || '}'
from information_schema.tables t
where table_schema = 'public'
union all
-- Связи между таблицами
select distinct ccu.table_name || ' "1" --> "0..N" ' || tc.table_name || format(' : "A %s may haven many %s"', ccu.table_name, tc.table_name)
from information_schema.table_constraints as tc
join information_schema.key_column_usage as kcu on tc.constraint_name = kcu.constraint_name
join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name
where tc.constraint_type = 'FOREIGN KEY'
and ccu.constraint_schema = 'public'
and tc.table_name ~ '.*'
union all
-- Подвал
select '@enduml'
Mena ka ata titiro koe, he maha nga taputapu whakaata e whakamahi ana i nga patai rite. Pono, he hohonu rawa enei tono
Te ine me te aroturuki
Me neke tatou ki tetahi kaupapa matatini o mua - database performance monitoring. Te haamana‘o nei au i te hoê aamu mau na‘ina‘i tei faati‘ahia ia‘u e « te hoê o to‘u mau hoa ». I tetahi atu kaupapa i noho tetahi DBA kaha, a he torutoru nga kaihanga i mohio ki a ia, i kite ranei ia ia (ahakoa te meka, e ai ki nga korero, i mahi ia i tetahi waahi i te whare e whai ake nei). I te haora "X", i te wa i timata ano te "pouri" o te punaha o te kaihokohoko nui, ka tukuna marie e ia nga whakaahua o nga kauwhata mai i Oracle Enterprise Manager, i tohuhia e ia nga waahi whakahirahira me te tohu whero mo te "maramatanga" ( tenei, ki te ngawari, kaore i tino awhina). A i runga i tenei "kaari whakaahua" me atawhai ahau. I te wa ano, kaore he tangata i uru ki te utu nui (i roto i nga tikanga e rua o te kupu) Kaiwhakahaere Enterprise, no te mea He uaua, he utu nui te punaha, ohorere "ka tutuki nga kaihanga ki tetahi mea ka pakaru nga mea katoa." Na reira, i kitea e nga kaiwhakawhanake "empirically" te waahi me te take o nga pakaru, ka tukuna he papaki. Ki te kore e tae mai ano te reta whakatuma mai i te DBA i nga wa e heke mai nei, katahi ka aue te katoa, ka hoki ano ki a raatau mahi o naianei (tae noa ki te Reta hou).
Engari ko te mahi aroturuki ka taea te ahua ngahau me te hoahoa, me te mea nui, he waatea me te marama mo te katoa. Ko tana waahanga taketake, hei taapiri atu ki nga punaha aroturuki matua (he tino whai hua me te maha o nga keehi kaore e taea te whakakapi). Ko nga DBMS he kore utu me te kore utu ki te tiri korero mo tona ahuatanga me ona mahinga o naianei. I roto i taua "toto" Oracle DB, tata ki nga korero mo te mahi ka taea te tiki mai i nga tirohanga a te punaha, mai i nga tukanga me nga waahi ki te ahua o te keteroki buffer (hei tauira,
No reira, ka mau ki etahi momo kaikohi inenga (Telegraf, Metricbeat, Collectd) ka taea te mahi i nga paatai sql ritenga, he rokiroki o enei inenga (InfluxDB, Elasticsearch, Timescaledb) me te kaitirotiro (Grafana, Kibana), ka taea e koe te tino ngawari. me te punaha aro turuki ngawari ka honoa ki etahi atu inenga-whanui (i whiwhi, hei tauira, mai i te tūmau tono, mai i te OS, me etahi atu). Hei tauira, ka mahia tenei i roto i te pgwatch2, e whakamahi ana i te InfluxDB + Grafana huinga me te huinga o nga patai ki nga tirohanga punaha, ka taea hoki te uru atu.
Te tapeke
A he rarangi tata noa tenei mo nga mea ka taea ki to maatau paparangi ma te whakamahi i te waehere SQL auau. E mohio ana ahau ka kitea e koe etahi atu whakamahinga, tuhia ki roto i nga korero. A ka korero tatou me pehea (me te mea nui he aha) ki te whakaaunoa i enei mea katoa me te whakauru ki roto i to paipa CI/CD a muri ake nei.
Source: will.com