DailyWatch માં, અમારા "સંબંધિત વિડિયો" પેનલની શરૂઆત એક સાધારણ SQLite ક્વેરીથી થઈ હતી. તેણે ત્રણ ટેબલને જોડ્યા, ઓવરલેપિંગ ટેગ્સની ગણતરી કરી અને એક ક્રમબદ્ધ યાદી રિટર્ન કરી. નાના કેટેલોગ માટે, તે પૂરતું હતું. "italian" અને "pasta" ટેગ ધરાવતો રસોઈનો વિડિયો તે જ ટેગ્સ ધરાવતા અન્ય વિડિયો બતાવતો હતો, અને યુઝર્સ તેના પર ક્લિક કરતા હતા. આઉટપુટ સુસંગત લાગતું હતું કારણ કે મેટાડેટા સ્વચ્છ હતો અને લાઈબ્રેરી નાની હતી.

પછી કેટેલોગ વધ્યો, અને પ્રેક્ષકોની અપેક્ષાઓ બદલાઈ. લોકોને માત્ર સમાન ટેગ્સ ધરાવતા વધુ વિડિયો જ જોઈતા નહોતા. તેઓ એવો ક્લિપ ઈચ્છતા હતા જે 40 ટકા દર્શકોએ વર્તમાન વિડિયો પછી તરત જ જોયો હોય. તેઓ એવી નિશ (niche) ચેનલ ઈચ્છતા હતા જે વારંવાર મોડી રાત્રિના વ્યુઇંગ સેશન્સમાં સામે આવતી હોય, ભલે તેના વર્ણનમાં શરૂઆતના વિડિયો વિશે કંઈ જ ન કહેવામાં આવ્યું હોય અને તેના ટેગ્સ પણ નહિવત હોય. આ વર્તણૂકલક્ષી પેટર્ન (behavioral patterns) છે, મેટાડેટા મેચ નહીં. SQLite તેને સેલ્ફ-જોઈન્સ અને રિકર્સિવ કોમન ટેબલ એક્સપ્રેશન્સના મેન્ટેન ન કરી શકાય તેવા જટિલ જાળામાં ફસાયા વગર વ્યક્ત કરી શકતું નહોતું. અમે મોડેલ કરવાનો પ્રયાસ કરતા દરેક નવા સિગ્નલ, પછી તે co-viewership હોય કે session adjacency, તે લેટન્સી અને માનસિક બોજ (mental overhead) વધારતા હતા. અમારી પાસે રિલેશનલ માળખામાં ફસાયેલી એક ગ્રાફ સમસ્યા હતી.

મેં રેકમેન્ડેશન લેયરને Apache AGE પર ખસેડ્યું.

Apache AGE એ એક PostgreSQL એક્સટેન્શન છે જે તમે પહેલેથી જ ચલાવી રહ્યા છો તે ડેટાબેઝમાં openCypher ગ્રાફ ક્વેરીઝ ઉમેરે છે. તે અલગ સર્વર નથી. તે સાઇડકાર (sidecar) નથી. તે Postgres ની અંદર ચાલે છે, જેનો અર્થ છે કે અમે સમર્પિત Neo4j ક્લસ્ટર ઊભું કર્યા વગર અથવા સંપૂર્ણપણે નવી ઓપરેશનલ પ્લેબુક શીખ્યા વગર એક co-view નેટવર્ક બનાવી શકતા હતા. ડેટાબેઝ રિલાયબિલિટી એન્જિનિયર વગરની નાની ટીમ માટે, આ તફાવત ખૂબ જ મહત્વપૂર્ણ હતો.

શા માટે એક્સટેન્શન નવા ડેટાબેઝ કરતા ચડિયાતું છે

તમારા સ્ટેકમાં ગ્રાફ ડેટાબેઝ ઉમેરવો વ્હાઇટબોર્ડ પર સરળ છે પરંતુ પ્રોડક્શનમાં મોંઘો છે. તમારે નવા મોનિટરિંગ ડેશબોર્ડ્સ, નવી બેકઅપ પ્રક્રિયાઓ, નવા કનેક્શન પૂલ્સ અને નવા ફેલઓવર લોજિકની જરૂર પડશે. AGE આ બધું ટાળી દે છે કારણ કે તે તમારા હાલના Postgres ઇન્સ્ટન્સની અંદર રહે છે.

આ અમારા માટે કામ કરવા પાછળ ચાર વ્યવહારિક કારણો છે.

  • નવું ઇન્ફ્રાસ્ટ્રક્ચર નહીં. કારણ કે AGE એ એક એક્સટેન્શન છે, તમારું વર્તમાન pg_dump શેડ્યૂલ, તમારા હાલના રેપ્લિકા અને તમારા સ્ટાન્ડર્ડ Postgres હેલ્થ ચેક્સ બધું જ કામ કરવાનું ચાલુ રાખશે. તમારે ઓપરેશન્સ ટીમને બીજા ડેટા સ્ટોરનું ધ્યાન રાખવા માટે મનાવવાની જરૂર નથી.
  • એક જ ક્વેરીમાં મિશ્ર વર્કલોડ્સ. AGE તમને SQL ની અંદર Cypher લખવા દે છે. તમે ઉમેદવાર વિડિયો શોધવા માટે ગ્રાફ ટ્રેવર્સલ ચલાવી શકો છો, પછી તે રિઝલ્ટ સેટને પ્રાદેશિક કન્ટેન્ટ પ્રતિબંધો લાગુ કરવા માટે તમારા રિલેશનલ users ટેબલ સાથે, અથવા ચોક્કસ ચેનલોને ઓછી પ્રાધાન્યતા આપવા માટે રિલેશનલ sponsorships ટેબલ સાથે જોડી શકો છો. એક જ રાઉન્ડ-ટ્રિપ. બે ક્વેરી લેંગ્વેજનું સહકાર.
  • પોર્ટેબિલિટી. Cypher એ એક ઓપન, સારી રીતે દસ્તાવેજીકૃત ગ્રાફ ક્વેરી લેંગ્વેજ છે. જો DailyWatch AGE થી વધી જાય અને પછીથી Neo4j અથવા Memgraph પર માઈગ્રેટ કરવાની જરૂર પડે, તો ક્વેરી લોજિક ન્યૂનતમ ફરીથી લખવા સાથે ટ્રાન્સફર થઈ જાય છે. તમે કોઈ પ્રોપ્રાઇટરી ડાયલેક્ટમાં ફસાયેલા નથી.
  • સુસંગતતા. કારણ કે ડેટા અંતે PostgreSQL માં રહે છે, તમારા હાલના PHP અથવા Python ટૂલિંગમાં ફેરફાર થતો નથી. તમે સમાન ડ્રાઇવર સાથે કનેક્ટ કરો છો, સમાન કનેક્શન સ્ટ્રિંગ્સ હેન્ડલ કરો છો અને તે જ રીતે રો (rows) મેળવો છો. ગ્રાફ લોજિક ક્વેરી લેયરમાં હોય છે, એપ્લિકેશન લેયરમાં નહીં.

Co-Viewershipનું મોડેલિંગ

અમલીકરણ સીધું અને સરળ છે. અમે જે એન્ટિટીઝમાં રસ ધરાવતા હતા તેના માટે નોડ્સ (nodes) વ્યાખ્યાયિત કર્યા: Video અને Channel. ત્યારબાદ અમે તેમની વચ્ચેના સંબંધો માટે એજિસ (edges) વ્યાખ્યાયિત કરી. એક PUBLISHED એજ Channel ને Video સાથે જોડે છે. એક CO_VIEWED એજ એક Video ને બીજા સાથે જોડે છે, જે weight પ્રોપર્ટી ધરાવે છે જે દર્શાવે છે કે બંને વિડિયો કેટલી વાર એક જ વ્યુઇંગ સેશનમાં દેખાયા હતા.

આ મોડેલ એવી વસ્તુને કેપ્ચર કરે છે જે ટેગ-આધારિત SQL કરી શકતું નથી: અપ્રત્યક્ષ માળખું (implicit structure)