Gaskiya da farko, ko me yasa ake buƙatar tsara tsarin bisa tsarin tsarin bayanai

Hai Habr!

Muna ci gaba da bincike kan batun Java и spring, ciki har da a matakin bayanai. A yau muna gayyatar ku don karanta game da dalilin da ya sa, lokacin zayyana manyan aikace-aikacen, tsarin tsarin bayanai ne, ba lambar Java ba, wanda ya kamata ya kasance da mahimmancin mahimmanci, yadda ake yin hakan, da menene keɓancewa ga wannan doka.

A cikin wannan labarin da ya wuce, zan bayyana dalilin da ya sa na yi imani cewa a kusan dukkanin lokuta, samfurin bayanai a cikin aikace-aikacen ya kamata a tsara shi "daga bayanan bayanai" maimakon "daga damar Java" (ko kowane harshe abokin ciniki da kuke da shi. aiki tare). Ta hanyar ɗaukar hanya ta biyu, kuna saita kanku don dogon hanya na ciwo da wahala da zarar aikinku ya fara girma.

An rubuta labarin bisa ga tambaya daya, da aka bayar akan Stack Overflow.

Tattaunawa masu ban sha'awa akan reddit a cikin sassan /r/java и /r/programming.

Ƙirƙirar lamba

Yaya na yi mamakin cewa akwai irin wannan ƙaramin ɓangaren masu amfani waɗanda suka saba da jOOQ, sun fusata da gaskiyar cewa jOOQ ya dogara da gaske ga ƙirƙirar lambar tushe don aiki. Babu wanda yake hana ku yin amfani da jOOQ yadda kuka ga dama, ko tilasta muku amfani da tsara lambar. Amma hanyar da ta dace (kamar yadda aka bayyana a cikin jagorar) hanyar yin aiki tare da jOOQ ita ce ka fara da tsarin bayanai (legacy), canza injiniyan shi ta amfani da janareta na lambar jOOQ don haka sami saitin azuzuwan da ke wakiltar tebur ɗin ku, sannan rubuta nau'in. -tambayoyi masu aminci ga waɗannan tebur:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ Информация о типах выведена на 
//   основании сгенерированного кода, на который ссылается приведенное
// ниже условие SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ сгенерированные имена
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

Ana samar da lambar ko dai da hannu a wajen taron, ko da hannu a kowace taro. Misali, irin wannan farfadowa na iya biyo baya nan da nan Hijira na bayanai na Flyway, wanda kuma ana iya yin shi da hannu ko ta atomatik.

Ƙirƙirar lambar tushe

Akwai falsafa daban-daban, fa'idodi da rashin amfani da ke tattare da waɗannan hanyoyin samar da lambar - manual da atomatik - waɗanda ba zan tattauna dalla-dalla a cikin wannan labarin ba. Amma, a gaba ɗaya, dukan batu na code ɗin da aka samar shine yana ba mu damar sake bugawa a cikin Java cewa "gaskiya" da muke ɗauka a matsayin kyauta, ko dai a cikin tsarinmu ko a waje da shi. A wata ma'ana, wannan shine abin da masu tarawa suke yi lokacin da suke samar da bytecode, lambar injin, ko wani nau'i na lambar tushe - muna samun wakilcin "gaskiya" a cikin wani harshe, ba tare da la'akari da takamaiman dalilai ba.

Akwai da yawa irin wannan code janareta. Misali, XJC na iya samar da lambar Java dangane da fayilolin XSD ko WSDL. Ka'idar koyaushe iri ɗaya ce:

  • Akwai wasu gaskiya (na ciki ko na waje) - misali, ƙayyadaddun bayanai, ƙirar bayanai, da sauransu.
  • Muna buƙatar wakilci na gida na wannan gaskiyar a cikin yaren shirye-shiryen mu.

Bugu da ƙari, kusan koyaushe yana da kyau a samar da irin wannan wakilci don guje wa sakewa.

Nau'in Masu Ba da Bayani da Gudanarwa

Lura: wani, ƙarin zamani kuma ƙayyadaddun tsarin ƙirƙira lambar don jOOQ yana amfani da nau'ikan masu samarwa, kamar yadda ake aiwatar da su a cikin F#. A wannan yanayin, lambar ta fito ne daga mai tarawa, a zahiri a matakin haɗawa. A ka'ida, irin wannan lambar ba ta wanzu a cikin hanyar tushe. Java yana da kama, ko da yake ba kayan aiki masu kyau ba - na'urori masu sarrafawa, misali, Lombok.

Ta wata ma’ana, abubuwa iri daya suke faruwa a nan kamar yadda aka yi a farkon lamarin, ban da:

  • Ba kwa ganin lambar da aka ƙirƙira (watakila wannan yanayin da alama ba shi da kyama ga wani?)
  • Dole ne ku tabbatar cewa ana iya samar da nau'ikan, wato, "gaskiya" dole ne a kasance koyaushe. Wannan yana da sauƙi a cikin yanayin Lombok, wanda ke bayyana "gaskiya". Yana da ɗan ƙara rikitarwa tare da ƙirar bayanai waɗanda suka dogara akan haɗin kai tsaye koyaushe.

Menene matsalar samar da code?

Bugu da ƙari, tambaya mai banƙyama na yadda mafi kyau don gudanar da tsara code - da hannu ko ta atomatik, dole ne mu ambaci cewa akwai mutanen da suka yi imani da cewa ba a buƙatar ƙaddamar da code kwata-kwata. Dalilin wannan ra'ayi, wanda na saba da shi akai-akai, shine cewa yana da wuya a kafa bututun ginawa. Eh lallai yana da wahala. Ƙarin farashin kayayyakin more rayuwa ya taso. Idan kawai kuna farawa da wani samfuri (ko jOOQ, ko JAXB, ko Hibernate, da dai sauransu), kafa yanayin samarwa yana ɗaukar lokaci da za ku gwammace ku ciyar da koyon API ɗin kanta don ku iya fitar da ƙima daga gare ta. .

Idan farashin da ke da alaƙa da fahimtar tsarin janareta ya yi yawa, to, hakika, API ɗin ya yi mummunan aiki akan amfani da janareta na lambar (kuma daga baya ya nuna cewa gyare-gyaren mai amfani a ciki shima yana da rikitarwa). Amfani ya kamata ya zama mafi girman fifiko ga kowane irin API. Amma wannan hujja ɗaya ce kawai akan ƙirar code. In ba haka ba, yana da cikakken jagora don rubuta wakilcin gida na gaskiya na ciki ko na waje.

Mutane da yawa za su ce ba su da lokacin yin duk wannan. Suna ƙarewa da ƙayyadaddun samfuran su na Super. Watarana za mu gyara na'urar daukar kaya, za mu sami lokaci. Zan amsa musu:

Gaskiya da farko, ko me yasa ake buƙatar tsara tsarin bisa tsarin tsarin bayanai
Asali, Alan O'Rourke, Tarin Masu Sauraro

Amma a cikin Hibernate/JPA yana da sauƙin rubuta lambar Java.

Da gaske. Ga Hibernate da masu amfani da shi, wannan duka albarka ne da la'ana. A cikin Hibernate zaku iya rubuta ƙungiyoyi biyu kawai, kamar haka:

	@Entity
class Book {
  @Id
  int id;
  String title;
}

Kuma kusan komai yana shirye. Yanzu ya kai ga Hibernate don samar da hadaddun "cikakkun bayanai" na yadda za a bayyana ainihin wannan mahallin a cikin DDL na "harshen" na SQL:

	CREATE TABLE book (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  title VARCHAR(50),
 
  CONSTRAINT pk_book PRIMARY KEY (id)
);
 
CREATE INDEX i_book_title ON book (title);

... kuma fara gudanar da aikace-aikacen. Kyakkyawan dama mai kyau don farawa da sauri da gwada abubuwa daban-daban.

Duk da haka, don Allah a ba ni izini. Na yi karya.

  • Shin Hibernate da gaske zai tilasta ma'anar wannan maɓalli na farko mai suna?
  • Shin Hibernate zai ƙirƙiri fihirisa a cikin TITLE? – Na san tabbas cewa za mu buƙaci shi.
  • Shin Hibernate zai sa ainihin wannan maɓalli ya gano cikin Ƙayyadaddun Shaida?

Wataƙila a'a. Idan kuna haɓaka aikinku daga karce, yana da dacewa koyaushe don kawai zubar da tsohuwar bayanai kuma samar da wani sabo da zaran kun ƙara bayanan da suka dace. Don haka, ƙungiyar Littafin za ta ɗauki tsari daga ƙarshe:

	@Entity
@Table(name = "book", indexes = {
  @Index(name = "i_book_title", columnList = "title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
  String title;
}

Sanyi Sake haɓakawa. Bugu da ƙari, a cikin wannan yanayin zai kasance da sauƙi a farkon.

Amma za ku biya daga baya

Ba dade ko ba dade za ku shiga cikin samarwa. Shi ke nan wannan samfurin zai daina aiki. Domin:

A cikin samarwa, ba zai yiwu ba, idan ya cancanta, zubar da tsohuwar bayanai kuma farawa daga karce. Bayanan bayananku zai zama gado.

Daga yanzu har abada za ku rubuta Rubutun ƙaura na DDL, misali, ta amfani da Flyway. Menene zai faru da ƙungiyoyin ku a wannan yanayin? Kuna iya ko dai daidaita su da hannu (saboda haka ninka nauyin aikinku), ko kuna iya gaya wa Hibernate don sabunta muku su (ta yaya waɗanda aka ƙirƙira su ta wannan hanyar don biyan tsammaninku?) Ko ta yaya, kuna rasa.

Don haka da zarar kun shiga samarwa za ku buƙaci faci masu zafi. Kuma suna bukatar a sanya su cikin sauri da sauri. Tun da ba ku shirya ba kuma ba ku shirya bututun mai santsi na ƙaura don samarwa ba, kuna yin komai sosai. Sannan ba ku da lokacin yin komai daidai. Kuma kuna sukar Hibernate, saboda koyaushe laifin wani ne, kawai ba ku ba ...

Maimakon haka, da an yi abubuwa dabam dabam daga farkonsu. Misali, sanya ƙafafun zagaye akan keke.

Database farko

Gaskiyar "gaskiya" a cikin tsarin bayananku da "sarauta" akanta yana cikin ma'ajin bayanai. Ma’anar ma’anar ma’anar ita ce kawai a cikin ma’adanar bayanai da kanta ba inda kuma, kowane abokin ciniki yana da kwafin wannan tsarin, don haka yana da cikakkiyar ma’ana don tilasta bin tsarin da amincinsa, don yin shi daidai a cikin ma’ajin bayanai – inda bayanin yake. adana.
Wannan tsohuwa ce, har da hikimar da ba ta dace ba. Maɓallai na farko da na musamman suna da kyau. Maɓallan ƙasashen waje suna da kyau. Duba ƙuntatawa yana da kyau. Zargi - Lafiya.

Bugu da ƙari, wannan ba duka ba ne. Misali, ta amfani da Oracle, tabbas za ku so a saka:

  • Wane sarari tebur ɗin ku yake?
  • Menene ƙimar PCTFREE?
  • Menene girman cache a jerinku (bayan id)

Wannan yana iya zama ba mahimmanci a cikin ƙananan tsarin ba, amma ba dole ba ne ku jira har sai kun matsa zuwa babban bayanan bayanai - za ku iya fara amfana daga ingantaccen kayan ajiya na mai siyarwa kamar waɗanda aka ambata a sama da wuri. Babu ɗayan ORM ɗin da na gani (ciki har da jOOQ) da ke ba da damar yin amfani da cikakken saitin zaɓuɓɓukan DDL da kuke son amfani da su a cikin bayananku. ORMs suna ba da wasu kayan aikin da ke taimaka maka rubuta DDL.

Amma a ƙarshen rana, da hannu an rubuta da'ira mai kyau a cikin DDL. Duk wani DDL da aka ƙirƙira shine kawai kusanta.

Me game da samfurin abokin ciniki?

Kamar yadda aka ambata a sama, akan abokin ciniki za ku buƙaci kwafin tsarin bayanan ku, kallon abokin ciniki. Ba lallai ba ne a faɗi, wannan ra'ayin abokin ciniki dole ne ya kasance daidai da ainihin ƙirar. Wace hanya ce mafi kyau don cimma wannan? Amfani da janareta code.

Duk bayanan bayanai suna ba da bayanan meta ta hanyar SQL. Ga yadda ake samun duk allunan daga bayananku a cikin yarukan SQL daban-daban:

	-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server
SELECT table_schema, table_name
FROM information_schema.tables
 
-- DB2
SELECT tabschema, tabname
FROM syscat.tables
 
-- Oracle
SELECT owner, table_name
FROM all_tables
 
-- SQLite
SELECT name
FROM sqlite_master
 
-- Teradata
SELECT databasename, tablename
FROM dbc.tables

Waɗannan tambayoyin (ko makamantan su, dangane da ko kuma dole ne kuyi la'akari da ra'ayoyi, ra'ayoyi na zahiri, ayyuka masu ƙimar tebur) kuma ana aiwatar da su ta hanyar kira. DatabaseMetaData.getTables() daga JDBC, ko amfani da jOOQ meta-module.

Daga sakamakon irin waɗannan tambayoyin, yana da sauƙi don samar da kowane wakilcin abokin ciniki na samfurin bayananku, ba tare da la'akari da irin fasahar da kuke amfani da ita akan abokin ciniki ba.

  • Idan kana amfani da JDBC ko Spring, za ka iya ƙirƙirar saitin madaurin kirtani
  • Idan kuna amfani da JPA, zaku iya ƙirƙirar abubuwan da kansu
  • Idan kun yi amfani da jOOQ, za ku iya samar da jOOQ meta-samfurin

Dangane da yawan ayyuka da API ɗin abokin ciniki ke bayarwa (misali jOOQ ko JPA), ƙirar meta da aka ƙirƙira na iya zama mai wadatuwa kuma cikakke. Dauki, misali, yuwuwar shiga cikin fayyace. An gabatar da shi a cikin jOOQ 3.11, wanda ya dogara da bayanan meta da aka samar game da maɓallan maɓalli na ƙasashen waje waɗanda ke tsakanin teburin ku.

Yanzu duk wani haɓakar bayanai zai sabunta lambar abokin ciniki ta atomatik. Ka yi tunanin misali:

ALTER TABLE book RENAME COLUMN title TO book_title;

Da gaske za ku so ku yi wannan aikin sau biyu? Babu shakka. Kawai ƙaddamar da DDL, gudanar da shi ta cikin bututun ginin ku, kuma sami abin da aka sabunta:

@Entity
@Table(name = "book", indexes = {
 
  // Вы об этом задумывались?
  @Index(name = "i_book_title", columnList = "book_title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
 
  @Column("book_title")
  String bookTitle;
}

Ko ajin jOOQ da aka sabunta. Yawancin canje-canjen DDL kuma suna shafar ilimin tauhidi, ba kawai syntax ba. Don haka, yana iya zama da amfani a duba cikin lambar da aka haɗa don ganin wace lambar za ta iya (ko ta iya) ƙarawa ta bayanan ku.

Gaskiya kawai

Ko da wane irin fasaha kuke amfani da shi, koyaushe akwai samfurin guda ɗaya wanda shine kawai tushen gaskiya ga wasu tsarin ƙasa - ko kuma, aƙalla, yakamata mu yi ƙoƙari don wannan kuma mu guji irin wannan rikicewar kasuwanci, inda "gaskiya" ke ko'ina kuma babu inda lokaci ɗaya. . Komai zai iya zama mafi sauƙi. Idan kawai kuna musayar fayilolin XML tare da wani tsarin, kawai yi amfani da XSD. Dubi samfurin INFORMATION_SCHEMA daga jOOQ a cikin hanyar XML:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD an fahimta sosai
  • XSD yana ba da alamar abun ciki na XML da kyau kuma yana ba da izinin inganci a cikin duk yarukan abokin ciniki
  • XSD an tsara shi da kyau kuma yana da ci gaba da dacewa da baya
  • Ana iya fassara XSD zuwa lambar Java ta amfani da XJC

Batu na ƙarshe yana da mahimmanci. Lokacin sadarwa tare da tsarin waje ta amfani da saƙonnin XML, muna son tabbatar da cewa saƙonmu suna aiki. Wannan yana da sauƙin cimma ta amfani da JAXB, XJC da XSD. Zai zama babban hauka don tunanin cewa, tare da tsarin ƙirar "Java farko" inda muke yin saƙonmu azaman abubuwan Java, cewa za'a iya yin taswira tare da juna zuwa XML kuma a aika zuwa wani tsarin don amfani. XML da aka samar ta wannan hanya zai zama maras inganci sosai, mara izini, da wahalar haɓakawa. Idan akwai yarjejeniyar matakin sabis (SLA) don irin wannan keɓancewa, za mu murkushe shi nan da nan.

Gaskiya, wannan shine abin da ke faruwa koyaushe tare da JSON APIs, amma wannan wani labari ne, zan yi jayayya a gaba ...

Databases: abu daya ne

Lokacin aiki tare da bayanan bayanai, za ku gane cewa duk suna kama da juna. Tushen ya mallaki bayanansa kuma dole ne ya sarrafa tsarin. Duk wani gyare-gyare da aka yi wa tsarin dole ne a aiwatar da shi kai tsaye a cikin DDL domin a sabunta tushen gaskiya guda ɗaya.

Lokacin da sabunta tushen ya faru, duk abokan ciniki dole ne su sabunta kwafin samfurin su. Ana iya rubuta wasu abokan ciniki cikin Java ta amfani da jOOQ da Hibernate ko JDBC (ko duka biyun). Ana iya rubuta wasu abokan ciniki a cikin Perl (muna yi musu fatan alheri), yayin da wasu za a iya rubuta su a cikin C #. Ba komai. Babban samfurin yana cikin ma'ajin bayanai. Samfuran da aka ƙirƙira ta amfani da ORMs yawanci ba su da inganci, mara kyau rubuce, da wahalar haɓakawa.

Don haka kar a yi kuskure. Kar ku yi kuskure tun daga farko. Aiki daga database. Gina bututun turawa wanda zai iya sarrafa kansa. Kunna masu janareta lambobi don sauƙaƙa kwafin ƙirar bayananku da zubar da shi akan abokan ciniki. Kuma ku daina damuwa game da masu samar da lambar. Suna da kyau. Tare da su za ku ƙara haɓaka. Kuna buƙatar ɗan ɗan lokaci kaɗan don saita su daga farkon farawa - sannan shekaru na haɓaka haɓaka suna jiran ku, wanda zai zama tarihin aikin ku.

Kar ku gode mani tukuna, daga baya.

Bayani

Don bayyanawa: Wannan labarin ba wata hanya ba yana ba da shawarar cewa kuna buƙatar lanƙwasa tsarin gaba ɗaya (watau yanki, dabarun kasuwanci, da sauransu, da sauransu) don dacewa da ƙirar bayanan ku. Abin da nake cewa a cikin wannan labarin shi ne cewa lambar abokin ciniki da ke hulɗa da ma'ajin bayanai ya kamata ya yi aiki bisa tsarin tsarin bayanai, don kada shi da kansa ya sake haifar da tsarin bayanai a matsayin "first-class". Wannan ma'anar yawanci yana samuwa a layin samun damar bayanai akan abokin cinikin ku.

A cikin gine-gine masu matakai biyu, waɗanda har yanzu ana kiyaye su a wasu wurare, irin wannan tsarin tsarin zai iya zama kawai mai yiwuwa. Duk da haka, a mafi yawan tsare-tsare Layer samun damar bayanai yana kama ni a matsayin "subsystem" wanda ke tattare da tsarin bayanai.

Ban da

Akwai keɓancewa ga kowace ƙa'ida, kuma na riga na faɗi cewa tsarin tattara bayanai-farko da tsarin tsara lambar tushe na iya zama mara dacewa a wasu lokuta. Anan akwai nau'ikan irin waɗannan keɓanta (wataƙila akwai wasu):

  • Lokacin da tsarin ba a san shi ba kuma yana buƙatar ganowa. Misali, kai ne mai samar da kayan aiki wanda ke taimaka wa masu amfani kewaya kowane zane. Ugh Babu tsara code a nan. Amma duk da haka, ma'aunin bayanai ya zo na farko.
  • Lokacin da dole ne a samar da da'ira akan tashi don magance wasu matsala. Wannan misalin yana kama da sigar ƙirar ɗan ɗan ban sha'awa darajar sifa mahaluži, watau, ba ku da ainihin ma'anar makirci. A wannan yanayin, sau da yawa ba za ku iya tabbatar da cewa RDBMS zai dace da ku ba.

Keɓance bisa dabi'a na kwarai ne. A mafi yawan lokuta da suka shafi amfani da RDBMS, tsarin da aka sani a gaba, yana zaune a cikin RDBMS kuma shine kawai tushen "gaskiya", kuma duk abokan ciniki dole ne su sami kwafin da aka samo daga gare ta. Da kyau, kuna buƙatar amfani da janareta na lamba.

source: www.habr.com

Add a comment