SQL, ಯಾವುದು ಸರಳವಾಗಿರಬಹುದು? ನಮ್ಮಲ್ಲಿ ಪ್ರತಿಯೊಬ್ಬರೂ ಸರಳ ವಿನಂತಿಯನ್ನು ಬರೆಯಬಹುದು - ನಾವು ಟೈಪ್ ಮಾಡುತ್ತೇವೆ ಆಯ್ಕೆಮಾಡಿ, ಅಗತ್ಯವಿರುವ ಕಾಲಮ್ಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡಿ, ನಂತರ ರಿಂದ, ಟೇಬಲ್ ಹೆಸರು, ಕೆಲವು ಷರತ್ತುಗಳು ಅಲ್ಲಿ ಮತ್ತು ಅಷ್ಟೆ - ಉಪಯುಕ್ತ ಡೇಟಾ ನಮ್ಮ ಜೇಬಿನಲ್ಲಿದೆ ಮತ್ತು (ಬಹುತೇಕ) ಆ ಸಮಯದಲ್ಲಿ ಯಾವ DBMS ಹುಡ್ ಅಡಿಯಲ್ಲಿದೆ (ಅಥವಾ ಬಹುಶಃ
ಮತ್ತು ಈಗಿನಿಂದಲೇ ಪ್ರಾರಂಭಿಸೋಣ
ಆಬ್ಜೆಕ್ಟ್-ರಿಲೇಶನಲ್ ಮ್ಯಾಪಿಂಗ್
ORM ಬೆಂಬಲಿಗರು ಸಾಂಪ್ರದಾಯಿಕವಾಗಿ ವೇಗ ಮತ್ತು ಅಭಿವೃದ್ಧಿಯ ಸುಲಭತೆ, DBMS ನಿಂದ ಸ್ವಾತಂತ್ರ್ಯ ಮತ್ತು ಕ್ಲೀನ್ ಕೋಡ್ ಅನ್ನು ಗೌರವಿಸುತ್ತಾರೆ. ನಮ್ಮಲ್ಲಿ ಅನೇಕರಿಗೆ, ಡೇಟಾಬೇಸ್ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವ ಕೋಡ್ (ಮತ್ತು ಸಾಮಾನ್ಯವಾಗಿ ಡೇಟಾಬೇಸ್ ಸ್ವತಃ)
ಇದು ಸಾಮಾನ್ಯವಾಗಿ ಈ ರೀತಿ ಕಾಣುತ್ತದೆ ...
@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;
}
...
ಮಾದರಿಯನ್ನು ಬುದ್ಧಿವಂತ ಟಿಪ್ಪಣಿಗಳೊಂದಿಗೆ ತೂಗುಹಾಕಲಾಗಿದೆ, ಮತ್ತು ಎಲ್ಲೋ ತೆರೆಮರೆಯಲ್ಲಿ ಧೀರ ORM ಕೆಲವು SQL ಕೋಡ್ಗಳನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ ಮತ್ತು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತದೆ. ಅಂದಹಾಗೆ, ಡೆವಲಪರ್ಗಳು ತಮ್ಮ ಡೇಟಾಬೇಸ್ನಿಂದ ಕಿಲೋಮೀಟರ್ಗಳ ಅಮೂರ್ತತೆಗಳೊಂದಿಗೆ ತಮ್ಮನ್ನು ಪ್ರತ್ಯೇಕಿಸಿಕೊಳ್ಳಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ, ಇದು ಕೆಲವನ್ನು ಸೂಚಿಸುತ್ತದೆ
ಬ್ಯಾರಿಕೇಡ್ಗಳ ಇನ್ನೊಂದು ಬದಿಯಲ್ಲಿ, ಶುದ್ಧ "ಕೈಯಿಂದ ಮಾಡಿದ" SQL ನ ಅನುಯಾಯಿಗಳು ಹೆಚ್ಚುವರಿ ಪದರಗಳು ಮತ್ತು ಅಮೂರ್ತತೆಗಳಿಲ್ಲದೆ ತಮ್ಮ DBMS ನಿಂದ ಎಲ್ಲಾ ರಸವನ್ನು ಹಿಂಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಗಮನಿಸುತ್ತಾರೆ. ಪರಿಣಾಮವಾಗಿ, "ಡೇಟಾ-ಕೇಂದ್ರಿತ" ಯೋಜನೆಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ, ಅಲ್ಲಿ ವಿಶೇಷವಾಗಿ ತರಬೇತಿ ಪಡೆದ ಜನರು ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ತೊಡಗಿಸಿಕೊಂಡಿದ್ದಾರೆ (ಅವರು ಸಹ "ಮೂಲಭೂತವಾದಿಗಳು", ಅವರು "ಮೂಲಭೂತವಾದಿಗಳು", ಅವರು "ಬೇಸಿಸ್ಟ್ಗಳು", ಇತ್ಯಾದಿ), ಮತ್ತು ಡೆವಲಪರ್ಗಳು ವಿವರಗಳಿಗೆ ಹೋಗದೆ ರೆಡಿಮೇಡ್ ವೀಕ್ಷಣೆಗಳು ಮತ್ತು ಸಂಗ್ರಹಿಸಿದ ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ಮಾತ್ರ "ಪುಲ್" ಮಾಡಬೇಕು.
ನಾವು ಎರಡೂ ಪ್ರಪಂಚದ ಅತ್ಯುತ್ತಮವನ್ನು ಹೊಂದಿದ್ದರೆ ಏನು? ಜೀವನವನ್ನು ದೃಢೀಕರಿಸುವ ಹೆಸರಿನೊಂದಿಗೆ ಅದ್ಭುತ ಸಾಧನದಲ್ಲಿ ಇದನ್ನು ಹೇಗೆ ಮಾಡಲಾಗುತ್ತದೆ
ಕ್ಲೋಜೂರ್ DSL ಗಳನ್ನು ರಚಿಸಲು ತಂಪಾದ ಭಾಷೆಯಾಗಿದೆ, ಆದರೆ SQL ಸ್ವತಃ ತಂಪಾದ DSL ಆಗಿದೆ, ಮತ್ತು ನಮಗೆ ಇನ್ನೊಂದು ಅಗತ್ಯವಿಲ್ಲ. ಎಸ್-ಎಕ್ಸ್ಪ್ರೆಶನ್ಗಳು ಉತ್ತಮವಾಗಿವೆ, ಆದರೆ ಅವು ಇಲ್ಲಿ ಹೊಸದನ್ನು ಸೇರಿಸುವುದಿಲ್ಲ. ಪರಿಣಾಮವಾಗಿ, ಬ್ರಾಕೆಟ್ಗಳ ಸಲುವಾಗಿ ನಾವು ಬ್ರಾಕೆಟ್ಗಳನ್ನು ಪಡೆಯುತ್ತೇವೆ. ಒಪ್ಪುವುದಿಲ್ಲವೇ? ಡೇಟಾಬೇಸ್ನ ಮೇಲಿನ ಅಮೂರ್ತತೆಯು ಸೋರಿಕೆಯಾಗಲು ಪ್ರಾರಂಭಿಸಿದಾಗ ಮತ್ತು ನೀವು ಕಾರ್ಯದೊಂದಿಗೆ ಹೋರಾಡಲು ಪ್ರಾರಂಭಿಸಿದಾಗ ಕ್ಷಣ ನಿರೀಕ್ಷಿಸಿ (ಕಚ್ಚಾ-ಚ.ಲೀ)
ಹಾಗಾದರೆ ನಾನು ಏನು ಮಾಡಬೇಕು? SQL ಅನ್ನು ಸಾಮಾನ್ಯ SQL ಆಗಿ ಬಿಡೋಣ - ಪ್ರತಿ ವಿನಂತಿಗೆ ಒಂದು ಫೈಲ್:
-- name: users-by-country
select *
from users
where country_code = :country_code
... ತದನಂತರ ಈ ಫೈಲ್ ಅನ್ನು ಓದಿ, ಅದನ್ನು ಸಾಮಾನ್ಯ ಕ್ಲೋಜೂರ್ ಕಾರ್ಯವಾಗಿ ಪರಿವರ್ತಿಸಿ:
(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" ...} ...)
"SQL ಸ್ವತಃ, ಕ್ಲೋಜುರ್ ಸ್ವತಃ" ತತ್ವವನ್ನು ಅನುಸರಿಸುವ ಮೂಲಕ, ನೀವು ಪಡೆಯುತ್ತೀರಿ:
- ವಾಕ್ಯರಚನೆಯ ಆಶ್ಚರ್ಯಗಳಿಲ್ಲ. ನಿಮ್ಮ ಡೇಟಾಬೇಸ್ (ಯಾವುದೇ ರೀತಿಯಂತೆ) SQL ಮಾನದಂಡದೊಂದಿಗೆ 100% ಅನುವರ್ತನೆ ಹೊಂದಿಲ್ಲ - ಆದರೆ ಇದು Yesql ಗೆ ಅಪ್ರಸ್ತುತವಾಗುತ್ತದೆ. SQL ಸಮಾನ ಸಿಂಟ್ಯಾಕ್ಸ್ನೊಂದಿಗೆ ಕಾರ್ಯಗಳಿಗಾಗಿ ನೀವು ಸಮಯವನ್ನು ಬೇಟೆಯಾಡಲು ಎಂದಿಗೂ ವ್ಯರ್ಥ ಮಾಡುವುದಿಲ್ಲ. ನೀವು ಎಂದಿಗೂ ಕಾರ್ಯಕ್ಕೆ ಹಿಂತಿರುಗಬೇಕಾಗಿಲ್ಲ (raw-sql "ಕೆಲವು('ಫಂಕಿ'::SYNTAX)")).
- ಅತ್ಯುತ್ತಮ ಸಂಪಾದಕ ಬೆಂಬಲ. ನಿಮ್ಮ ಸಂಪಾದಕರು ಈಗಾಗಲೇ ಅತ್ಯುತ್ತಮ SQL ಬೆಂಬಲವನ್ನು ಹೊಂದಿದ್ದಾರೆ. SQL ಅನ್ನು SQL ಆಗಿ ಉಳಿಸುವ ಮೂಲಕ ನೀವು ಅದನ್ನು ಸರಳವಾಗಿ ಬಳಸಬಹುದು.
- ತಂಡದ ಹೊಂದಾಣಿಕೆ. ನಿಮ್ಮ ಕ್ಲೋಜೂರ್ ಯೋಜನೆಯಲ್ಲಿ ನೀವು ಬಳಸುವ SQL ಅನ್ನು ನಿಮ್ಮ DBA ಗಳು ಓದಬಹುದು ಮತ್ತು ಬರೆಯಬಹುದು.
- ಸುಲಭವಾದ ಕಾರ್ಯಕ್ಷಮತೆ ಟ್ಯೂನಿಂಗ್. ಸಮಸ್ಯಾತ್ಮಕ ಪ್ರಶ್ನೆಗೆ ಯೋಜನೆಯನ್ನು ನಿರ್ಮಿಸುವ ಅಗತ್ಯವಿದೆಯೇ? ನಿಮ್ಮ ಪ್ರಶ್ನೆಯು ಸಾಮಾನ್ಯ SQL ಆಗಿರುವಾಗ ಇದು ಸಮಸ್ಯೆಯಲ್ಲ.
- ಮರುಬಳಕೆ ಪ್ರಶ್ನೆಗಳು. ಅದೇ SQL ಫೈಲ್ಗಳನ್ನು ಇತರ ಪ್ರಾಜೆಕ್ಟ್ಗಳಿಗೆ ಎಳೆಯಿರಿ ಮತ್ತು ಬಿಡಿ ಏಕೆಂದರೆ ಇದು ಕೇವಲ ಹಳೆಯ SQL ಆಗಿದೆ - ಅದನ್ನು ಹಂಚಿಕೊಳ್ಳಿ.
ನನ್ನ ಅಭಿಪ್ರಾಯದಲ್ಲಿ, ಕಲ್ಪನೆಯು ತುಂಬಾ ತಂಪಾಗಿದೆ ಮತ್ತು ಅದೇ ಸಮಯದಲ್ಲಿ ತುಂಬಾ ಸರಳವಾಗಿದೆ, ಯೋಜನೆಯು ಅನೇಕರನ್ನು ಗಳಿಸಿದೆ
IDE ಮತ್ತು DB ವ್ಯವಸ್ಥಾಪಕರು
ಸರಳವಾದ ದೈನಂದಿನ ಕಾರ್ಯದೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸೋಣ. ಸಾಮಾನ್ಯವಾಗಿ ನಾವು ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಕೆಲವು ವಸ್ತುಗಳನ್ನು ಹುಡುಕಬೇಕಾಗಿದೆ, ಉದಾಹರಣೆಗೆ, ಸ್ಕೀಮಾದಲ್ಲಿ ಟೇಬಲ್ ಅನ್ನು ಹುಡುಕಿ ಮತ್ತು ಅದರ ರಚನೆಯನ್ನು ಅಧ್ಯಯನ ಮಾಡಿ (ಯಾವ ಕಾಲಮ್ಗಳು, ಕೀಗಳು, ಸೂಚ್ಯಂಕಗಳು, ನಿರ್ಬಂಧಗಳು, ಇತ್ಯಾದಿಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ). ಮತ್ತು ಯಾವುದೇ ಚಿತ್ರಾತ್ಮಕ IDE ಅಥವಾ ಸ್ವಲ್ಪ DB-ಮ್ಯಾನೇಜರ್ನಿಂದ, ಮೊದಲನೆಯದಾಗಿ, ನಾವು ನಿಖರವಾಗಿ ಈ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ನಿರೀಕ್ಷಿಸುತ್ತೇವೆ. ಆದ್ದರಿಂದ ಇದು ವೇಗವಾಗಿರುತ್ತದೆ ಮತ್ತು ಅಗತ್ಯ ಮಾಹಿತಿಯೊಂದಿಗೆ ವಿಂಡೋವನ್ನು ಎಳೆಯುವವರೆಗೆ ನೀವು ಅರ್ಧ ಗಂಟೆ ಕಾಯಬೇಕಾಗಿಲ್ಲ (ವಿಶೇಷವಾಗಿ ರಿಮೋಟ್ ಡೇಟಾಬೇಸ್ಗೆ ನಿಧಾನ ಸಂಪರ್ಕದೊಂದಿಗೆ), ಮತ್ತು ಅದೇ ಸಮಯದಲ್ಲಿ, ಸ್ವೀಕರಿಸಿದ ಮಾಹಿತಿಯು ತಾಜಾ ಮತ್ತು ಪ್ರಸ್ತುತವಾಗಿದೆ, ಮತ್ತು ಜಂಕ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಲಾಗಿಲ್ಲ. ಇದಲ್ಲದೆ, ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾದ ಮತ್ತು ದೊಡ್ಡದಾದ ಡೇಟಾಬೇಸ್ ಮತ್ತು ಅವುಗಳಲ್ಲಿ ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆ, ಇದನ್ನು ಮಾಡಲು ಹೆಚ್ಚು ಕಷ್ಟ.
ಆದರೆ ಸಾಮಾನ್ಯವಾಗಿ ನಾನು ಮೌಸ್ ಅನ್ನು ಎಸೆದು ಕೋಡ್ ಬರೆಯುತ್ತೇನೆ. "HR" ಸ್ಕೀಮಾದಲ್ಲಿ ಯಾವ ಕೋಷ್ಟಕಗಳು (ಮತ್ತು ಯಾವ ಗುಣಲಕ್ಷಣಗಳೊಂದಿಗೆ) ಒಳಗೊಂಡಿವೆ ಎಂಬುದನ್ನು ನೀವು ಕಂಡುಹಿಡಿಯಬೇಕು ಎಂದು ಹೇಳೋಣ. ಹೆಚ್ಚಿನ DBMS ಗಳಲ್ಲಿ, ಮಾಹಿತಿ_ಸ್ಕೀಮಾದಿಂದ ಈ ಸರಳ ಪ್ರಶ್ನೆಯೊಂದಿಗೆ ಬಯಸಿದ ಫಲಿತಾಂಶವನ್ನು ಸಾಧಿಸಬಹುದು:
select table_name
, ...
from information_schema.tables
where schema = 'HR'
ಡೇಟಾಬೇಸ್ನಿಂದ ಡೇಟಾಬೇಸ್ಗೆ, ಅಂತಹ ಉಲ್ಲೇಖ ಕೋಷ್ಟಕಗಳ ವಿಷಯಗಳು ಪ್ರತಿ DBMS ನ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಅವಲಂಬಿಸಿ ಬದಲಾಗುತ್ತವೆ. ಮತ್ತು, ಉದಾಹರಣೆಗೆ, MySQL ಗಾಗಿ, ಅದೇ ಉಲ್ಲೇಖ ಪುಸ್ತಕದಿಂದ ನೀವು ಈ DBMS ಗೆ ನಿರ್ದಿಷ್ಟವಾದ ಟೇಬಲ್ ನಿಯತಾಂಕಗಳನ್ನು ಪಡೆಯಬಹುದು:
select table_name
, storage_engine -- Используемый "движок" ("MyISAM", "InnoDB" etc)
, row_format -- Формат строки ("Fixed", "Dynamic" etc)
, ...
from information_schema.tables
where schema = 'HR'
ಒರಾಕಲ್ಗೆ ಮಾಹಿತಿ_ಸ್ಕೀಮಾ ತಿಳಿದಿಲ್ಲ, ಆದರೆ ಅದು ಹೊಂದಿದೆ
select table_name
, pct_free -- Минимум свободного места в блоке данных (%)
, pct_used -- Минимум используемого места в блоке данных (%)
, last_analyzed -- Дата последнего сбора статистики
, ...
from all_tables
where owner = 'HR'
ClickHouse ಇದಕ್ಕೆ ಹೊರತಾಗಿಲ್ಲ:
select name
, engine -- Используемый "движок" ("MergeTree", "Dictionary" etc)
, ...
from system.tables
where database = 'HR'
ಕಸ್ಸಂದ್ರದಲ್ಲಿ ಇದೇ ರೀತಿಯದ್ದನ್ನು ಮಾಡಬಹುದು (ಇದು ಟೇಬಲ್ಗಳ ಬದಲಿಗೆ ಕಾಲಮ್ಕುಟುಂಬಗಳನ್ನು ಮತ್ತು ಸ್ಕೀಮಾಗಳ ಬದಲಿಗೆ ಕೀಸ್ಪೇಸ್ಗಳನ್ನು ಹೊಂದಿದೆ):
select columnfamily_name
, compaction_strategy_class -- Стратегия сборки мусора
, gc_grace_seconds -- Время жизни мусора
, ...
from system.schema_columnfamilies
where keyspace_name = 'HR'
ಹೆಚ್ಚಿನ ಇತರ ಡೇಟಾಬೇಸ್ಗಳಿಗಾಗಿ, ನೀವು ಇದೇ ರೀತಿಯ ಪ್ರಶ್ನೆಗಳೊಂದಿಗೆ ಸಹ ಬರಬಹುದು (ಮೊಂಗೋ ಕೂಡ ಹೊಂದಿದೆ
ಸಹಜವಾಗಿ, ಈ ರೀತಿಯಾಗಿ ನೀವು ಕೋಷ್ಟಕಗಳ ಬಗ್ಗೆ ಮಾತ್ರವಲ್ಲ, ಸಾಮಾನ್ಯವಾಗಿ ಯಾವುದೇ ವಸ್ತುವಿನ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಬಹುದು. ಕಾಲಕಾಲಕ್ಕೆ, ರೀತಿಯ ಜನರು ವಿಭಿನ್ನ ಡೇಟಾಬೇಸ್ಗಳಿಗಾಗಿ ಅಂತಹ ಕೋಡ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತಾರೆ, ಉದಾಹರಣೆಗೆ, ಹಬ್ರಾ ಲೇಖನಗಳ ಸರಣಿಯಲ್ಲಿ “PostgreSQL ಡೇಟಾಬೇಸ್ಗಳನ್ನು ದಾಖಲಿಸುವ ಕಾರ್ಯಗಳು” (
ಪರಿಣಾಮವಾಗಿ, ನ್ಯಾವಿಗೇಟ್ ಮಾಡುವ ಮತ್ತು ವಸ್ತುಗಳನ್ನು ಹುಡುಕುವ ಈ ವಿಧಾನವು ಹೆಚ್ಚು ಮೃದುವಾಗಿರುತ್ತದೆ, ಸಾಕಷ್ಟು ಸಮಯವನ್ನು ಉಳಿಸುತ್ತದೆ ಮತ್ತು ಈಗ ಅಗತ್ಯವಿರುವ ರೂಪದಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು ನಿಖರವಾಗಿ ಪಡೆಯಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ (ಉದಾಹರಣೆಗೆ, ಪೋಸ್ಟ್ನಲ್ಲಿ ವಿವರಿಸಿದಂತೆ
ವಸ್ತುಗಳೊಂದಿಗೆ ಕಾರ್ಯಾಚರಣೆಗಳು
ನಾವು ಅಗತ್ಯ ವಸ್ತುಗಳನ್ನು ಕಂಡುಕೊಂಡ ನಂತರ ಮತ್ತು ಅಧ್ಯಯನ ಮಾಡಿದ ನಂತರ, ಅವರೊಂದಿಗೆ ಉಪಯುಕ್ತವಾದದ್ದನ್ನು ಮಾಡುವ ಸಮಯ. ನೈಸರ್ಗಿಕವಾಗಿ, ಕೀಬೋರ್ಡ್ನಿಂದ ನಿಮ್ಮ ಬೆರಳುಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳದೆಯೇ.
ಟೇಬಲ್ ಅನ್ನು ಅಳಿಸುವುದು ಬಹುತೇಕ ಎಲ್ಲಾ ಡೇಟಾಬೇಸ್ಗಳಲ್ಲಿ ಒಂದೇ ರೀತಿ ಕಾಣುತ್ತದೆ ಎಂಬುದು ರಹಸ್ಯವಲ್ಲ:
drop table hr.persons
ಆದರೆ ಮೇಜಿನ ರಚನೆಯೊಂದಿಗೆ ಅದು ಹೆಚ್ಚು ಆಸಕ್ತಿಕರವಾಗುತ್ತದೆ. ಯಾವುದೇ DBMS (ಹಲವು NoSQL ಸೇರಿದಂತೆ) ಒಂದು ರೂಪದಲ್ಲಿ ಅಥವಾ ಇನ್ನೊಂದರಲ್ಲಿ "ಟೇಬಲ್ ಅನ್ನು ರಚಿಸಬಹುದು", ಮತ್ತು ಅದರ ಮುಖ್ಯ ಭಾಗವು ಸ್ವಲ್ಪ ಭಿನ್ನವಾಗಿರುತ್ತದೆ (ಹೆಸರು, ಕಾಲಮ್ಗಳ ಪಟ್ಟಿ, ಡೇಟಾ ಪ್ರಕಾರಗಳು), ಆದರೆ ಇತರ ವಿವರಗಳು ನಾಟಕೀಯವಾಗಿ ಭಿನ್ನವಾಗಿರುತ್ತವೆ ಮತ್ತು ಅವಲಂಬಿಸಿರುತ್ತದೆ ಆಂತರಿಕ ಸಾಧನ ಮತ್ತು ನಿರ್ದಿಷ್ಟ DBMS ಸಾಮರ್ಥ್ಯಗಳು. ನನ್ನ ಮೆಚ್ಚಿನ ಉದಾಹರಣೆಯೆಂದರೆ ಒರಾಕಲ್ ದಸ್ತಾವೇಜನ್ನು "ಟೇಬಲ್ ರಚಿಸಿ" ಸಿಂಟ್ಯಾಕ್ಸ್ಗಾಗಿ ಕೇವಲ "ಬೆತ್ತಲೆ" BNF ಗಳು ಮಾತ್ರ ಇವೆ
ಅಲ್ಲದೆ, ಅನೇಕ DBMS ಗಳು ಇತರ DBMS ಗಳಲ್ಲಿ ಲಭ್ಯವಿಲ್ಲದ ತಮ್ಮದೇ ಆದ ನಿರ್ದಿಷ್ಟ ರೀತಿಯ ವಸ್ತುಗಳನ್ನು ಹೊಂದಿವೆ. ಇದಲ್ಲದೆ, ನಾವು ಡೇಟಾಬೇಸ್ ಆಬ್ಜೆಕ್ಟ್ಗಳಲ್ಲಿ ಮಾತ್ರವಲ್ಲದೆ ಡಿಬಿಎಂಎಸ್ನಲ್ಲಿಯೂ ಸಹ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಮಾಡಬಹುದು, ಉದಾಹರಣೆಗೆ, ಪ್ರಕ್ರಿಯೆಯನ್ನು "ಕೊಲ್ಲು", ಕೆಲವು ಮೆಮೊರಿ ಪ್ರದೇಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಿ, ಪತ್ತೆಹಚ್ಚುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ, "ಓದಲು ಮಾತ್ರ" ಮೋಡ್ಗೆ ಬದಲಿಸಿ ಮತ್ತು ಇನ್ನಷ್ಟು.
ಈಗ ಸ್ವಲ್ಪ ಸೆಳೆಯೋಣ
ಡೇಟಾಬೇಸ್ ವಸ್ತುಗಳೊಂದಿಗೆ ರೇಖಾಚಿತ್ರವನ್ನು ನಿರ್ಮಿಸುವುದು ಮತ್ತು ಅವುಗಳ ನಡುವಿನ ವಸ್ತುಗಳು ಮತ್ತು ಸಂಪರ್ಕಗಳನ್ನು ಸುಂದರವಾದ ಚಿತ್ರದಲ್ಲಿ ನೋಡುವುದು ಸಾಮಾನ್ಯ ಕಾರ್ಯಗಳಲ್ಲಿ ಒಂದಾಗಿದೆ. ಬಹುತೇಕ ಯಾವುದೇ ಚಿತ್ರಾತ್ಮಕ IDE, ಪ್ರತ್ಯೇಕ "ಕಮಾಂಡ್ ಲೈನ್" ಉಪಯುಕ್ತತೆಗಳು, ವಿಶೇಷ ಚಿತ್ರಾತ್ಮಕ ಉಪಕರಣಗಳು ಮತ್ತು ಮಾಡೆಲರ್ಗಳು ಇದನ್ನು ಮಾಡಬಹುದು. ಅವರು ನಿಮಗಾಗಿ ಏನನ್ನಾದರೂ "ಅವರು ಸಾಧ್ಯವಾದಷ್ಟು ಉತ್ತಮವಾಗಿ" ಸೆಳೆಯುತ್ತಾರೆ ಮತ್ತು ಇಂಟರ್ಫೇಸ್ನಲ್ಲಿನ ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ ಅಥವಾ ಚೆಕ್ಬಾಕ್ಸ್ಗಳಲ್ಲಿ ಕೆಲವು ನಿಯತಾಂಕಗಳ ಸಹಾಯದಿಂದ ಮಾತ್ರ ನೀವು ಈ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸ್ವಲ್ಪಮಟ್ಟಿಗೆ ಪ್ರಭಾವಿಸಬಹುದು.
ಆದರೆ ಈ ಸಮಸ್ಯೆಯನ್ನು ಹೆಚ್ಚು ಸರಳ, ಹೆಚ್ಚು ಹೊಂದಿಕೊಳ್ಳುವ ಮತ್ತು ಸೊಗಸಾದ, ಮತ್ತು ಕೋಡ್ ಸಹಾಯದಿಂದ ಸಹಜವಾಗಿ ಪರಿಹರಿಸಬಹುದು. ಯಾವುದೇ ಸಂಕೀರ್ಣತೆಯ ರೇಖಾಚಿತ್ರಗಳನ್ನು ರಚಿಸಲು, ನಾವು ಹಲವಾರು ವಿಶೇಷ ಮಾರ್ಕ್ಅಪ್ ಭಾಷೆಗಳನ್ನು ಹೊಂದಿದ್ದೇವೆ (DOT, GraphML ಇತ್ಯಾದಿ), ಮತ್ತು ಅವರಿಗೆ ಅಂತಹ ಸೂಚನೆಗಳನ್ನು ಓದುವ ಮತ್ತು ಅವುಗಳನ್ನು ವಿವಿಧ ಸ್ವರೂಪಗಳಲ್ಲಿ ದೃಶ್ಯೀಕರಿಸುವ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಸಂಪೂರ್ಣ ಸ್ಕ್ಯಾಟರಿಂಗ್ (GraphViz, PlantUML, Mermaid). . ಒಳ್ಳೆಯದು, ವಸ್ತುಗಳು ಮತ್ತು ಅವುಗಳ ನಡುವಿನ ಸಂಪರ್ಕಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಹೇಗೆ ಪಡೆಯುವುದು ಎಂದು ನಮಗೆ ಈಗಾಗಲೇ ತಿಳಿದಿದೆ.
PlantUML ಮತ್ತು ಬಳಸಿಕೊಂಡು ಇದು ಹೇಗಿರಬಹುದು ಎಂಬುದರ ಸಣ್ಣ ಉದಾಹರಣೆ ಇಲ್ಲಿದೆ
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'
ಮತ್ತು ನೀವು ಸ್ವಲ್ಪ ಪ್ರಯತ್ನಿಸಿದರೆ, ನಂತರ ಆಧರಿಸಿ
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'
ನೀವು ಹತ್ತಿರದಿಂದ ನೋಡಿದರೆ, ಹುಡ್ ಅಡಿಯಲ್ಲಿ ಅನೇಕ ದೃಶ್ಯೀಕರಣ ಉಪಕರಣಗಳು ಇದೇ ರೀತಿಯ ಪ್ರಶ್ನೆಗಳನ್ನು ಬಳಸುತ್ತವೆ. ನಿಜ, ಈ ವಿನಂತಿಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಆಳವಾದವು
ಮೆಟ್ರಿಕ್ಸ್ ಮತ್ತು ಮಾನಿಟರಿಂಗ್
ಸಾಂಪ್ರದಾಯಿಕವಾಗಿ ಸಂಕೀರ್ಣವಾದ ವಿಷಯಕ್ಕೆ ಹೋಗೋಣ - ಡೇಟಾಬೇಸ್ ಕಾರ್ಯಕ್ಷಮತೆಯ ಮೇಲ್ವಿಚಾರಣೆ. "ನನ್ನ ಸ್ನೇಹಿತರೊಬ್ಬರು" ನನಗೆ ಹೇಳಿದ ಒಂದು ಸಣ್ಣ ನೈಜ ಕಥೆ ನನಗೆ ನೆನಪಿದೆ. ಮತ್ತೊಂದು ಯೋಜನೆಯಲ್ಲಿ ಒಂದು ನಿರ್ದಿಷ್ಟ ಶಕ್ತಿಯುತ ಡಿಬಿಎ ವಾಸಿಸುತ್ತಿದ್ದರು, ಮತ್ತು ಕೆಲವು ಡೆವಲಪರ್ಗಳು ಅವರನ್ನು ವೈಯಕ್ತಿಕವಾಗಿ ತಿಳಿದಿದ್ದರು, ಅಥವಾ ಅವರನ್ನು ವೈಯಕ್ತಿಕವಾಗಿ ನೋಡಿದ್ದರು (ವದಂತಿಗಳ ಪ್ರಕಾರ, ಅವರು ಮುಂದಿನ ಕಟ್ಟಡದಲ್ಲಿ ಎಲ್ಲೋ ಕೆಲಸ ಮಾಡಿದರು) . "X" ಗಂಟೆಯಲ್ಲಿ, ದೊಡ್ಡ ಚಿಲ್ಲರೆ ವ್ಯಾಪಾರಿಗಳ ಉತ್ಪಾದನೆಯ ವ್ಯವಸ್ಥೆಯು ಮತ್ತೊಮ್ಮೆ "ಕೆಟ್ಟ ಭಾವನೆಯನ್ನು" ಪ್ರಾರಂಭಿಸಿದಾಗ, ಅವರು ಮೌನವಾಗಿ ಒರಾಕಲ್ ಎಂಟರ್ಪ್ರೈಸ್ ಮ್ಯಾನೇಜರ್ನಿಂದ ಗ್ರಾಫ್ಗಳ ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ಕಳುಹಿಸಿದರು, ಅದರ ಮೇಲೆ ಅವರು "ಗ್ರಹಿಕೆ" ಗಾಗಿ ಕೆಂಪು ಮಾರ್ಕರ್ನೊಂದಿಗೆ ನಿರ್ಣಾಯಕ ಸ್ಥಳಗಳನ್ನು ಎಚ್ಚರಿಕೆಯಿಂದ ಹೈಲೈಟ್ ಮಾಡಿದರು ( ಇದು ಸ್ವಲ್ಪಮಟ್ಟಿಗೆ ಹೇಳುವುದಾದರೆ, ಹೆಚ್ಚು ಸಹಾಯ ಮಾಡಲಿಲ್ಲ). ಮತ್ತು ಈ "ಫೋಟೋ ಕಾರ್ಡ್" ಆಧಾರದ ಮೇಲೆ ನಾನು ಚಿಕಿತ್ಸೆ ನೀಡಬೇಕಾಗಿತ್ತು. ಅದೇ ಸಮಯದಲ್ಲಿ, ಅಮೂಲ್ಯವಾದ (ಪದದ ಎರಡೂ ಅರ್ಥಗಳಲ್ಲಿ) ಎಂಟರ್ಪ್ರೈಸ್ ಮ್ಯಾನೇಜರ್ಗೆ ಯಾರೂ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರಲಿಲ್ಲ, ಏಕೆಂದರೆ ವ್ಯವಸ್ಥೆಯು ಸಂಕೀರ್ಣ ಮತ್ತು ದುಬಾರಿಯಾಗಿದೆ, ಇದ್ದಕ್ಕಿದ್ದಂತೆ "ಡೆವಲಪರ್ಗಳು ಏನನ್ನಾದರೂ ಮುಗ್ಗರಿಸಿ ಎಲ್ಲವನ್ನೂ ಮುರಿಯುತ್ತಾರೆ." ಆದ್ದರಿಂದ, ಡೆವಲಪರ್ಗಳು "ಪ್ರಾಯೋಗಿಕವಾಗಿ" ಬ್ರೇಕ್ಗಳ ಸ್ಥಳ ಮತ್ತು ಕಾರಣವನ್ನು ಕಂಡುಕೊಂಡರು ಮತ್ತು ಪ್ಯಾಚ್ ಅನ್ನು ಬಿಡುಗಡೆ ಮಾಡಿದರು. ಮುಂದಿನ ದಿನಗಳಲ್ಲಿ ಡಿಬಿಎಯಿಂದ ಬೆದರಿಕೆ ಪತ್ರವು ಮತ್ತೆ ಬರದಿದ್ದರೆ, ಎಲ್ಲರೂ ನೆಮ್ಮದಿಯ ನಿಟ್ಟುಸಿರು ಬಿಡುತ್ತಾರೆ ಮತ್ತು ತಮ್ಮ ಪ್ರಸ್ತುತ ಕಾರ್ಯಗಳಿಗೆ (ಹೊಸ ಪತ್ರದವರೆಗೆ) ಹಿಂತಿರುಗುತ್ತಾರೆ.
ಆದರೆ ಮೇಲ್ವಿಚಾರಣಾ ಪ್ರಕ್ರಿಯೆಯು ಹೆಚ್ಚು ವಿನೋದ ಮತ್ತು ಸ್ನೇಹಪರವಾಗಿ ಕಾಣುತ್ತದೆ, ಮತ್ತು ಮುಖ್ಯವಾಗಿ, ಎಲ್ಲರಿಗೂ ಪ್ರವೇಶಿಸಬಹುದು ಮತ್ತು ಪಾರದರ್ಶಕವಾಗಿರುತ್ತದೆ. ಕನಿಷ್ಠ ಅದರ ಮೂಲ ಭಾಗ, ಮುಖ್ಯ ಮೇಲ್ವಿಚಾರಣಾ ವ್ಯವಸ್ಥೆಗಳಿಗೆ ಹೆಚ್ಚುವರಿಯಾಗಿ (ಇದು ಖಂಡಿತವಾಗಿಯೂ ಉಪಯುಕ್ತವಾಗಿದೆ ಮತ್ತು ಅನೇಕ ಸಂದರ್ಭಗಳಲ್ಲಿ ಭರಿಸಲಾಗದು). ಯಾವುದೇ DBMS ಅದರ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿ ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆಯ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಉಚಿತವಾಗಿ ಮತ್ತು ಸಂಪೂರ್ಣವಾಗಿ ಉಚಿತವಾಗಿದೆ. ಅದೇ "ರಕ್ತಸಿಕ್ತ" ಒರಾಕಲ್ DB ನಲ್ಲಿ, ಪ್ರಕ್ರಿಯೆಗಳು ಮತ್ತು ಸೆಷನ್ಗಳಿಂದ ಹಿಡಿದು ಬಫರ್ ಕ್ಯಾಶ್ನ ಸ್ಥಿತಿಯವರೆಗೆ ಸಿಸ್ಟಮ್ ವೀಕ್ಷಣೆಗಳಿಂದ ಕಾರ್ಯಕ್ಷಮತೆಯ ಬಗ್ಗೆ ಯಾವುದೇ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಬಹುದು (ಉದಾಹರಣೆಗೆ,
ಹೀಗಾಗಿ, ಕಸ್ಟಮ್ sql ಪ್ರಶ್ನೆಗಳನ್ನು ನಿರ್ವಹಿಸಬಲ್ಲ ಕೆಲವು ರೀತಿಯ ಮೆಟ್ರಿಕ್ಸ್ ಸಂಗ್ರಾಹಕ (ಟೆಲಿಗ್ರಾಫ್, ಮೆಟ್ರಿಕ್ಬೀಟ್, ಕಲೆಕ್ಟೆಡ್) ನೊಂದಿಗೆ ಶಸ್ತ್ರಸಜ್ಜಿತವಾಗಿದೆ, ಈ ಮೆಟ್ರಿಕ್ಗಳ ಸಂಗ್ರಹಣೆ (ಇನ್ಫ್ಲಕ್ಸ್ಡಿಬಿ, ಎಲಾಸ್ಟಿಕ್ಸರ್ಚ್, ಟೈಮ್ಸ್ಕೇಲ್ಡ್ಬಿ) ಮತ್ತು ವಿಶ್ಯುಲೈಜರ್ (ಗ್ರಾಫನಾ, ಕಿಬಾನಾ), ನೀವು ಸಾಕಷ್ಟು ಸುಲಭವಾಗಿ ಪಡೆಯಬಹುದು ಮತ್ತು ಹೊಂದಿಕೊಳ್ಳುವ ಮೇಲ್ವಿಚಾರಣಾ ವ್ಯವಸ್ಥೆಯು ಇತರ ಸಿಸ್ಟಮ್-ವೈಡ್ ಮೆಟ್ರಿಕ್ಗಳೊಂದಿಗೆ ನಿಕಟವಾಗಿ ಸಂಯೋಜಿಸಲ್ಪಡುತ್ತದೆ (ಉದಾಹರಣೆಗೆ, ಅಪ್ಲಿಕೇಶನ್ ಸರ್ವರ್ನಿಂದ, OS ನಿಂದ, ಇತ್ಯಾದಿ. ಪಡೆಯಲಾಗಿದೆ). ಉದಾಹರಣೆಗೆ, ಇದನ್ನು pgwatch2 ನಲ್ಲಿ ಮಾಡಲಾಗುತ್ತದೆ, ಇದು InfluxDB + Grafana ಸಂಯೋಜನೆಯನ್ನು ಮತ್ತು ಸಿಸ್ಟಮ್ ವೀಕ್ಷಣೆಗಳಿಗೆ ಪ್ರಶ್ನೆಗಳ ಗುಂಪನ್ನು ಬಳಸುತ್ತದೆ, ಅದನ್ನು ಸಹ ಪ್ರವೇಶಿಸಬಹುದು
ಒಟ್ಟು
ಮತ್ತು ಇದು ಸಾಮಾನ್ಯ SQL ಕೋಡ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ನಮ್ಮ ಡೇಟಾಬೇಸ್ನೊಂದಿಗೆ ಏನು ಮಾಡಬಹುದು ಎಂಬುದರ ಅಂದಾಜು ಪಟ್ಟಿ ಮಾತ್ರ. ನೀವು ಇನ್ನೂ ಹೆಚ್ಚಿನ ಉಪಯೋಗಗಳನ್ನು ಕಾಣಬಹುದು ಎಂದು ನನಗೆ ಖಾತ್ರಿಯಿದೆ, ಕಾಮೆಂಟ್ಗಳಲ್ಲಿ ಬರೆಯಿರಿ. ಮತ್ತು ಈ ಎಲ್ಲವನ್ನೂ ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುವುದು ಮತ್ತು ಮುಂದಿನ ಬಾರಿ ಅದನ್ನು ನಿಮ್ಮ CI/CD ಪೈಪ್ಲೈನ್ನಲ್ಲಿ ಸೇರಿಸುವುದು ಹೇಗೆ (ಮತ್ತು ಮುಖ್ಯವಾಗಿ ಏಕೆ) ಎಂಬುದರ ಕುರಿತು ನಾವು ಮಾತನಾಡುತ್ತೇವೆ.
ಮೂಲ: www.habr.com