"Database ut Codex" Usus

"Database ut Codex" Usus

SQL quid simplicius? Quisque nostrum petitionem simplicem scribere potest - nos typus eligerepone columnas inquisitas, deinde a, nomen tabellae, aliquae conditiones in ubi et quod omnia utilia sunt in sinu nostro, et cuiuscumque DBMS sub cucullo eo tempore est (vel fortasse. non DBMS omnino). Quam ob rem laborans cum fonte aliquo fere dato (relativorum et non ita) considerari potest ex parte codicis ordinarii (cum omnia quae involvit - versionis imperium, codicem recensitum, analysis static, autotests et omnia). Idque non solum notitia ipsa, schemata et migrationes, sed generatim ad totam vitam reponunt. In hoc articulo loquemur de quotidianis officiis ac quaestionibus operandi cum variis databases sub lentis "databasi in codice".

Et ius e ORM. Prima proelia generis "SQL vs ORM" in tergo notati sunt pre-Petrinus Rus'.

Objectum relationis tabularum faciendarum

ORM fautores traditionally celeritatem et facilitatem evolutionis aestimant, independentiam a DBMS et codice mundo. Pro multis nobis, signum operandi cum datorum datorum (et saepe ipsum datorum)

Solet spectat aliquid simile hoc...

@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;
    }
  ...

Exemplar cum notationibus ingeniosis appensum est, et alicubi post scenas fortissimus ORM tons alicuius codicis SQL gignit et exsequitur. Obiter tincidunt se optime conantur secludere a datorum suorum chiliometrorum abstractorum, quod significat nonnulla. "SQL odium".

Ex altera parte obices, adhaerentes purae "ancillae" SQL notant facultatem exprimendi omnem sucum ex suis DBMS sine stratis et abstractionibus adiectis. Quo fit, "data-centrica" ​​apparent, ubi homines proprie exercitati in datorum implicantur (sunt etiam "basicists", sunt etiam "basicists", sunt etiam "basdarii", etc., et machinis. solum "trahere" sententias promptas factas et rationes repositas habere, quin in singula iret.

Quid si utriusque mundi optimum haberemus? Quomodo hoc fit miro instrumento cum nomine vitali affirmantis Yesql. Lineas duas a generali notione in libera translatione dabo, et accuratius id cognoscere potes. hic.

Clojure lingua frigida est ad creandum DSLs, sed ipsa SQL frigidum est DSL et alio non indigemus. S-elocutiones magnae sunt, sed nihil hic novi addunt. Quam ob rem uncis uncis dabimus. Noli assentire? Tunc expecta momentum temporis cum abstractio super datorum diffluere incipit et incipit pugnare cum officio (rudis-sql)

Quid igitur faciam? SQL abeamus ut ordinarius SQL - una lima per petitionem:

-- name: users-by-country
select *
  from users
 where country_code = :country_code

... ac deinde hunc fasciculum lege, in regulari functione Clojure versans;

(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" ...} ...)

Adhaerendo "SQL per se, Clojure per se" principium, accipis:

  • Minime syntactic admiror. Your database (sicut alius) non est 100% obsecundans cum vexillo SQL - sed hoc non refert pro Yesql. Numquam tempus perdis venationis pro functionibus cum syntaxi SQL aequivalens. Numquam redire ad munus (raw-sql "quidam ('funky''::SYNTAX)")).
  • Optime editori faveo. Editor tuus iam subsidium optimum SQL habet. Salvo SQL ut SQL simpliciter uti potes.
  • Quadrigis convenientiae. DBAs Tuae legere et scribere possunt SQL in project Clojure tuo uteris.
  • Facilior observantia hitur. Quid opus est aedificare consilium quaestionis problematicae? Hoc problema non est cum interrogatione tua SQL regularis est.
  • Reusing queries. Trahunt et stillabunt easdem SQL lima in alia incepta, quia suus 'antiquus SQL patet — modo eam communica.

Opinor, idea frigidissima est et simul simplicissima, propter quam res multas consecutus est sectatores in variis linguis. Et mox conabimur similem philosophiam separandi codicem SQL ab omnibus aliis longe ultra ORM.

IDE & DB managers

Incipiamus cum simplici officio quotidiano. Saepe quaerenda sunt aliqua obiecta in datorum, exempli gratia, tabulam in schemate invenire et eius structuram investigare (quae columnae, claves, indices, angustiae, etc. adhibentur). Et ab IDE graphicali quovis vel paulo DB-procuratore, ante omnia has vires prorsus expectamus. Ita ut ieiunium et dimidium horae non exspectandum sit, donec fenestra cum necessariis indiciis (praesertim cum lento nexu ad datorum remotam remotam) trahatur, et simul notitiae receptae recentes sint et ad rem pertinentes; nec conditivo junk. Quo autem magis complexus et maior datorum et numerus eorum, eo difficilius est hoc facere.

Sed plerumque murem abicio et mox codicem scribemus. Dicamus debes invenire quaenam tabulae (et quibus proprietatibus) in schemate "HR" contineantur. In plerisque DBMSs, effectus optatus effici potest cum hac simplici interrogatione ex informationibus_schema:

select table_name
     , ...
  from information_schema.tables
 where schema = 'HR'

Ex datorum ad database, contenta tabularum talium referentiae variantur secundum facultates cuiusque DBMS. Et, exempli gratia, pro MySQL, ex eodem libro referente potes mensas parametros huic DBMS specificas accipere;

select table_name
     , storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
     , row_format     -- Формат строки ("Fixed", "Dynamic" etc)
     , ...
  from information_schema.tables
 where schema = 'HR'

Oraculum informationes_schemae non scit, sed habet Oraculum metadataneque magnae difficultates oriuntur;

select table_name
     , pct_free       -- Минимум свободного места в блоке данных (%)
     , pct_used       -- Минимум используемого места в блоке данных (%)
     , last_analyzed  -- Дата последнего сбора статистики
     , ...
  from all_tables
 where owner = 'HR'

ClickHouse non est exceptio:

select name
     , engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
     , ...
  from system.tables
 where database = 'HR'

Simile aliquid fieri potest in Cassandra (quod habet columnas familiarum pro tabulis et clavibus loco schematum);

select columnfamily_name
     , compaction_strategy_class  -- Стратегия сборки мусора
     , gc_grace_seconds           -- Время жизни мусора
     , ...
  from system.schema_columnfamilies
 where keyspace_name = 'HR'

Pro plerisque aliis databases, etiam cum similibus quaestionibus (etiam Mongo has .) ascendere potes specialis ratio collectioqui informationem de omnibus collectionibus systematis continet).

Nempe hoc modo non solum de tabulis, sed de quaque re in universum cognoscere potes. Aliquando benigni homines talem codicem pro diversis databases communicant, exempli gratia in serie habra articulorum "Munctiones pro documentis databases PostgreSQL" (Ayb, Ben, gym). Sane totum hunc montem queriarum in capite meo retinens et eas typings assidue delectat, ita in IDE/editor meo praeparatum habeo copiam excerpta frequentiarum queriarum, et omnia quae supersunt typus est. objectum nomina in template.

Quam ob rem methodus haec navigandi et quaerendi obiectorum multo magis flexibilium est, multum temporis servat, ac permittit ut exacte notitias in forma, in qua nunc opus est, (sicut in postibus descriptis. "Educendi notitias e database in quavis forma; quod IDEs facere possunt in suggestu Intellij").

Res ad objecta

Postquam res necessarias invenimus et quaesivimus, tempus est illis aliquid utile facere. Naturaliter etiam sine digitis ad tincidunt.

Nullum secretum est quod mensam simpliciter delendo eandem in omnibus fere databases spectabit:

drop table hr.persons

Sed creatio mensae magis iucunda fit. Fere quaelibet DBMS (inclusa multa NoSQL) potest "mensam creare" in una forma vel alia, et principalis eius pars etiam leviter differet (nomen, index columnarum, genera notitiarum), sed alia singularia dramatically differre et ab eo dependent. interna fabrica et facultates certae DBMS. Meus ventus exemplum est quod in documentis Oraculi tantum "nudus" BNFs pro syntaxi "mensae creare" occupare XXXI paginas. Aliae DBMSs moderatiores facultates habent, sed unaquaeque earum etiam multas interesting et unicas notas habet ad mensas conficiendas (Postgres, MySQL, blatta, Venus). Verisimile est quod quaevis magus graphica ab alia IDE (praesertim universalis) omnes has facultates plene operire poterit, ac, si fieri potest, spectacula non pusillanimis erit. Eodem tempore recte et opportune scriptum partum mensam ut facile omnibus his utere permittet, reponendam et accessum ad notitias tuas certas, optimas et quam maxime commodas fac.

Multae etiam DBMSs proprias species obiectorum specificas habent quae in aliis DBMSs praesto non sunt. Praeterea operationes non solum in obiectis datorum, sed etiam in ipsis DBMS exercere possumus, verbi gratia "occidere" processum, aream aliquam memoriae liberare, pertractare, flectere ad modum tantum et multo magis "legere".

Nunc paululum ducamus

Una munerum communissima est schema cum rebus datorum aedificare et res et nexus videre in pictura pulchra. Fere quaelibet IDE graphica, utilitas "mandati lineae" separatae, instrumenta graphica propria et exemplares hoc facere possunt. Aliquid tibi "quantum valebunt" haurient, et hunc processum paulum inflectere potes solum adiuvantibus aliquot parametris in fasciculi conformatione vel checkboxes in interface.

Sed haec quaestio multo simplicior, flexibilior et elegans solvi potest, et sane ope codicis. Ad schemata cuiuslibet complexionis efficiendam, linguas notas speciales (DOT, GraphML etc.) habemus, eisque totam applicationum sparsionem (GraphViz, PlantUML, Mermaid) quae tales instructiones legere possunt et eas in varia formarum formare visualizare. . Bene iam novimus notitias rerum et nexus inter eos acquirere.

Exiguum exemplum huius rei simile esse potuit, adhibito PlantUML et demo database for PostgreSQL (In sinistris est SQL quaesitum, quod requisitam disciplinam PlantUML generabit, et a dextra est effectus);

"Database ut Codex" Usus

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'

Et si parum conaris, tunc innititur ER template for PlantUML aliquid simile verae ER schematis accipere potes:

SQL quaesitum est paulo multiplex

-- Шапка
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'

"Database ut Codex" Usus

Si inspicias, sub cucullo multa instrumenta visualizationis similia quaestionibus utuntur. Verum, hae petitiones plerumque penitus sunt "fere" in ipso applicationis codice et in intellectu difficili suntne de ulla earum modificatione.

Metrica et vigilantia

Transeamus ad thema traditum complexum - magna observantia database. Ego memini parvam veram fabulam narravit mihi per "unum ex amicis meis". In alio incepto vixit quidam potens DBA, et pauci e tincidunt eum personaliter cognoverunt, vel eum in persona umquam viderant (non obstante quod, ut fama est, alicubi in altera aedificatione elaboravit). Hora "X", cum poductionis systematis magni venditoris iterum "male sentire coepit", tacite misit elocutiones grapharum ex Oraculo Incepti Procuratoris, in quibus diligenter illustravit loca critica cum titulo rubro "comprehensibilitatis" ( hoc, ut leniter ferret, multum profuit). Et ex hoc "photo card" tractare habui. Eodem tempore, nemo pretioso (utroque verbo sensu) Procurator inceptum accessum habuit, quia ratio est multiplex et pretiosa, repente "in tincidunt offendunt in aliquid et omnia frangunt." Ideo tincidunt "empirice" locum et causam iaculis invenerunt et commissuram dimisit. Si litterae minae DBA in proximo futuro non pervenerunt, omnes suspirant subsidii ac redeunt ad hodiernos labores (usque ad novam Epistulam).

Sed magna processus potest inspicere magis fun et amica, ac potissimum, omnibus perspicuum et perspicuum. Partem suam saltem fundamentalem, ut additamentum ad praecipuos systemata vigilantia (quae certe utiles sunt et multis in casibus pernecessarias). Quivis DBMS gratis et absolute gratis communicaturus est informationes de statu suo praesenti et effectu. In eodem "sanguino" Oraculo DB, quaelibet fere notitia de effectu obtineri potest ex visibus systematis, a processibus et sessionibus ad statum quiddam cache (exempli gratia: DBA Scriptssectio "magna". Postgresql etiam totum fasciculum systematis views pro . habet database vigilantiapraesertim quae necessariae sunt in vita cotidiana cuiuslibet DBA, ut pg_stat_activity, pg_stat_database, pg_stat_bwriter. MySQL etiam hoc schema separatum habet. performance_schema. A in Mongo constructum-in profiler aggregata perficientur notitia in systema collection system.profile.

Sic armata cum aliquo genere metri collectoris (Telegraf, Metricbeat, Collectd) quae consuetudo sql queries conficere potest, tabularium harum metrorum (InfluxDB, Elasticsearch, Timescaledb) et visualiser (Grafana, Kibana), satis facilem habere potes. ac flexibilis ratio vigilantia, quae cum aliis metricis systematis-wideribus arcte coniungetur (obtinetur, exempli gratia, ex applicatione servo, ab OS, etc.). Ut, exempli gratia, hoc fit in pgwatch2, quo InfluxDB + Grafana utitur compositione et statuto quaestionis ad opiniones systematis quae accedere possunt. mos addere queries.

in summa

Et hoc solum est index proximus proximus eorum quae fieri possunt cum nostro database utens codice regulari SQL. Multos usus invenire potes, scribe in comment. Et loquemur quomodo (et maxime cur) haec omnia automate et includere in pipelino tuo CI/CD proximo tempore.

Source: www.habr.com

Add a comment