ආයුබෝවන් සියල්ලටම! මම Java + Spring හි microservices ලියන පසුපෙළ සංවර්ධකයෙක්. මම Tinkoff හි අභ්යන්තර නිෂ්පාදන සංවර්ධන කණ්ඩායමක වැඩ කරමි.
අපගේ කණ්ඩායම තුළ, DBMS හි විමසුම් ප්රශස්ත කිරීම පිළිබඳ ප්රශ්නය බොහෝ විට පැන නගී. ඔබට සෑම විටම මඳක් වේගවත් වීමට අවශ්ය වේ, නමුත් ඔබට සෑම විටම කල්පනාකාරීව ගොඩනඟන ලද දර්ශක සමඟින් ලබා ගත නොහැක - ඔබට යම් විසඳුම් සෙවිය යුතුය. දත්ත සමුදායන් සමඟ වැඩ කිරීමේදී සාධාරණ ප්රශස්තකරණයන් සෙවීම සඳහා වෙබය පුරා සැරිසැරීමේදී, මට හමු විය
මාකස්ගේ කෙටි ලිපියක් ඔබ වෙනුවෙන් පරිවර්තනය කිරීමට මම කැමැත්තෙමි. එය SQL ප්රමිතියට අනුව ඕෆ්සෙට් මෙහෙයුමේ ක්රියාකාරිත්වය පිළිබඳ පැරණි, නමුත් තවමත් අදාළ ගැටලුව කෙරෙහි අවධානය යොමු කිරීමට උත්සාහ කරන ප්රතිපත්ති ප්රකාශනයක් ලෙස හැඳින්විය හැකිය.
සමහර තැන්වල මම කතුවරයාට පැහැදිලි කිරීම් සහ අදහස් සමඟ අතිරේක කරමි. මම එවැනි සියලුම ස්ථාන "ආසන්න වශයෙන්" සඳහන් කරමි. වඩාත් පැහැදිලිකම සඳහා
කුඩා හැඳින්වීමක්
මම හිතන්නේ බොහෝ අය ඕෆ්සෙට් හරහා පිටු තේරීම් සමඟ වැඩ කිරීම කොතරම් ගැටළු සහගත සහ මන්දගාමීද යන්න දන්නවා. එය වඩාත් කාර්යක්ෂම නිර්මාණයක් සමඟින් එය ඉතා පහසුවෙන් ප්රතිස්ථාපනය කළ හැකි බව ඔබ දැන සිටියාද?
එබැවින්, ඕෆ්සෙට් මූල පදය දත්ත සමුදායට ඉල්ලීමේ පළමු n වාර්තා මඟ හැරීමට කියයි. කෙසේ වෙතත්, දත්ත සමුදායට තවමත් මෙම පළමු n වාර්තා තැටියෙන් ලබා දී ඇති අනුපිළිවෙලට කියවීමට අවශ්ය වේ (සටහන: එය සඳහන් කර ඇත්නම් වර්ග කිරීම යොදන්න), එවිට පමණක් n+1 සිට වාර්තා නැවත ලබා දීමට හැකි වනු ඇත. වඩාත්ම සිත්ගන්නා කරුණ නම් ගැටළුව ඇත්තේ DBMS හි නිශ්චිත ක්රියාත්මක කිරීමේදී නොව ප්රමිතියට අනුව මුල් නිර්වචනයේ ය:
…පේළි මුලින්ම අනුපිළිවෙළට සකසනු ලැබේ සහ පසුව හි නිශ්චිතව දක්වා ඇති පේළි ගණන පහත දැමීමෙන් සීමා වේ මුල සිට…
-SQL:2016, 2 කොටස, 4.15.3 ව්යුත්පන්න වගු (සටහන: දැනට වැඩිපුරම භාවිතා වන සම්මතය)
මෙහි ප්රධාන කරුණ නම් ඕෆ්සෙට් එක පරාමිතියක් ගනී - මඟ හැරිය යුතු වාර්තා ගණන, සහ එපමණයි. මෙම නිර්වචනය අනුගමනය කරමින්, DBMS හට සියලු වාර්තා ලබා ගත හැකි අතර පසුව අනවශ්ය ඒවා ඉවත දැමිය හැක. නිසැකවම, ඕෆ්සෙට් හි මෙම අර්ථ දැක්වීම අමතර වැඩ කිරීමට අපට බල කරයි. එය SQL ද NoSQL ද යන්න ගැටළුවක් නොවේ.
තව ටිකක් වේදනාව
ඕෆ්සෙට් සමඟ ඇති ගැටළු එතැනින් අවසන් නොවේ, ඒ මන්ද යන්නයි. තැටියෙන් දත්ත පිටු දෙකක් කියවීම අතර, තවත් මෙහෙයුමක් නව වාර්තාවක් ඇතුළත් කළහොත්, මෙම නඩුවේ කුමක් සිදුවේද?
පෙර පිටු වලින් වාර්තා මඟ හැරීමට ඕෆ්සෙට් භාවිතා කරන විට, විවිධ පිටු කියවීම් අතර නව වාර්තාවක් එක් කිරීමේ තත්වය තුළ, ඔබට බොහෝ විට අනුපිටපත් ලැබෙනු ඇත (සටහන: අපි ගොඩනැගීමෙන් අනුපිළිවෙල භාවිතා කර පිටුවෙන් පිටුව කියවන විට මෙය කළ හැකිය, එවිට අපගේ ප්රතිදානය මැද එය නව ප්රවේශයක් ලබා ගත හැක).
රූපය මෙම තත්ත්වය පැහැදිලිව නිරූපණය කරයි. පාදය පළමු වාර්තා 10 කියවයි, ඉන්පසු නව වාර්තාවක් ඇතුළත් කරනු ලැබේ, එය සියලු කියවීම් වාර්තා 1 න් හිලව් කරයි. එවිට පාදය ඊළඟ වාර්තා 10 න් නව පිටුවක් ගෙන 11 වෙනිදා සිට ආරම්භ කළ යුතු පරිදි නොව, 10 වැනි, මෙම වාර්තාව අනුපිටපත් කරමින්. මෙම ප්රකාශනය භාවිතා කිරීම හා සම්බන්ධ වෙනත් විෂමතා ඇත, නමුත් මෙය වඩාත් පොදු වේ.
අප දැනටමත් සොයාගෙන ඇති පරිදි, මේවා නිශ්චිත DBMS හෝ ඒවායේ ක්රියාත්මක කිරීම් වල ගැටළු නොවේ. ගැටළුව වන්නේ SQL ප්රමිතියට අනුව pagination නිර්වචනය කිරීමයි. අපි DBMS වෙත කුමන පිටුව ලබා ගත යුතුද යන්න හෝ කොපමණ වාර්තා මඟ හැරිය යුතුද යන්න කියමු. මේ සඳහා තොරතුරු ඉතා අඩු බැවින් දත්ත සමුදායට එවැනි ඉල්ලීමක් ප්රශස්ත කිරීමට නොහැකි වේ.
මෙය නිශ්චිත මූල පදයක ගැටළුවක් නොව, විමසුමේ අර්ථ ශාස්ත්රයේ ගැටලුවක් බව පැහැදිලි කිරීම වටී. ගැටළුකාරී ස්වභාවයට සමාන තවත් වාක්ය ඛණ්ඩ කිහිපයක් තිබේ:
- ඕෆ්සෙට් මූල පදය කලින් සඳහන් කළ පරිදි ය.
- මූල පද දෙකක සීමාවක් [ඕෆ්සෙට්] ගොඩනැගීම (සීමාව එතරම් නරක නැතත්).
- පේළි අංක කිරීම (උදාහරණයක් ලෙස, row_number(), rownum, ආදිය) මත පදනම්ව, පහළ සීමාවන් මගින් පෙරීම.
මෙම සියලුම ප්රකාශන මඟින් ඔබට මඟ හැරිය යුතු රේඛා ගණන, අමතර තොරතුරු හෝ සන්දර්භය නැත.
මෙම ලිපියේ පසුව, මෙම සියලු විකල්පවල සාරාංශයක් ලෙස ඕෆ්සෙට් මූල පදය භාවිතා වේ.
OFFSET නැති ජීවිතය
දැන් අපි හිතමු මේ සියලු ගැටලු නොමැතිව අපේ ලෝකය කෙබඳු වේදැයි. ඕෆ්සෙට් නොමැතිව ජීවිතය එතරම් අපහසු නොවන බව පෙනේ: තේරීමක් සමඟ, ඔබට අප තවමත් දැක නැති පේළි පමණක් තෝරා ගත හැකිය (සටහන: එනම්, පෙර පිටුවේ නොතිබූ ඒවා), එහිදී කොන්දේසියක් භාවිතා කරයි.
මෙම අවස්ථාවෙහිදී, අපි ආරම්භ කරන්නේ ඇණවුම් කරන ලද කට්ටලයක් (හොඳ පැරණි අනුපිළිවෙල අනුව) මත තෝරා ගැනීම් ක්රියාත්මක වන බැවිනි. අප සතුව ඇණවුම් කට්ටලයක් ඇති බැවින්, පෙර පිටුවේ අවසාන වාර්තාව පිටුපස ඇති දත්ත පමණක් ලබා ගැනීමට අපට තරමක් සරල පෙරහනක් භාවිතා කළ හැකිය:
SELECT ...
FROM ...
WHERE ...
AND id < ?last_seen_id
ORDER BY id DESC
FETCH FIRST 10 ROWS ONLY
මෙම ප්රවේශයේ සම්පූර්ණ මූලධර්මය එයයි. ඇත්ත වශයෙන්ම, බොහෝ තීරු අනුව වර්ග කිරීමේදී දේවල් වඩාත් විනෝදජනක වේ, නමුත් අදහස තවමත් එසේමය. මෙම නිර්මාණය බොහෝ දෙනෙකුට අදාළ වන බව සැලකිල්ලට ගැනීම වැදගත්ය
මෙම ප්රවේශය search method හෝ keyset pagination ලෙස හැඳින්වේ. එය පාවෙන ප්රතිපල ගැටළුව විසඳයි (සටහන: කලින් විස්තර කර ඇති පිටු කියවීම් අතර ලිවීමේ තත්වය) සහ, ඇත්ත වශයෙන්ම, අපි කවුරුත් ආදරය කරන දෙය, එය සම්භාව්ය ඕෆ්සෙට් වලට වඩා වේගවත් හා ස්ථාවර ලෙස ක්රියා කරයි. ස්ථාවරත්වය පවතින්නේ ඉල්ලීම් සැකසීමේ කාලය ඉල්ලුම් කළ වගුවේ සංඛ්යාවට සමානුපාතිකව වැඩි නොවන බැවිනි (සටහන: ඔබට පිටු සැකසීමට විවිධ ප්රවේශයන් පිළිබඳ වැඩිදුර ඉගෙන ගැනීමට අවශ්ය නම්, ඔබට හැකිය
ස්ලයිඩ වලින් එකක්
මෙවලම් ගැන කුමක් කිව හැකිද?
මෙම ක්රමය සඳහා උපකරණ ආධාරක නොමැතිකම හේතුවෙන් යතුරු මත පිටු තැබීම බොහෝ විට සුදුසු නොවේ. විවිධ රාමු ඇතුළුව බොහෝ සංවර්ධන මෙවලම්, ඔබට පිටු සැකසීම සිදු කරන්නේ කෙසේද යන්න නිවැරදිව තෝරා ගැනීමට ඉඩ නොදේ.
විස්තර කරන ලද ක්රමයට භාවිතා කරන තාක්ෂණයන්හි අවසානය දක්වා සහය අවශ්ය වේ - DBMS සිට නිමක් නැති අනුචලනය සමඟ බ්රවුසරයේ AJAX ඉල්ලීමක් ක්රියාත්මක කිරීම දක්වා තත්වය වඩාත් නරක අතට හැරේ. පිටු අංකය පමණක් සඳහන් කිරීම වෙනුවට, ඔබට දැන් සියලුම පිටු සඳහා යතුරු කට්ටලයක් එකවර සඳහන් කළ යුතුය.
කෙසේ වෙතත්, යතුරු මත පිටු සැකසීමට සහාය වන රාමු ගණන ක්රමයෙන් වර්ධනය වේ. මේ මොහොතේ අප සතුව ඇති දේ මෙන්න:
jOOQ ජාවා සඳහා;ඇණවුම්_විමසුම Ruby සඳහා;chunkator иDjango Infinite Scroll Pagination ජැන්ගෝ සඳහා;SQL ඇල්කෙමි sqlakeyset පයිතන් සඳහා;ගිනි දැල්වීම - නොනැසී පැවතීම - JPA ක්රියාත්මක කිරීම සඳහා නිර්ණායක API;DBIx:: පන්තිය:: දවටනය පර්ල් සඳහා;Massive.js , Node.js සඳහා සිතියම්කරුයතුරු කට්ටල ලේඛනගත කිරීම .
(සටහන: පරිවර්තන අවස්ථාවේ සමහර පුස්තකාල 2017-2018 සිට යාවත්කාලීන කර නොතිබීම හේතුවෙන් සමහර සබැඳි ඉවත් කරන ලදී. ඔබ කැමති නම්, ඔබට මුල් මූලාශ්රය බලන්න.)
ඔබගේ උදව් අවශ්ය වන්නේ මේ මොහොතේය. ඔබ පිටු දැකීම භාවිතා කරන රාමුවක් සංවර්ධනය කරන්නේ නම් හෝ සහාය දක්වන්නේ නම්, මම ඉල්ලා සිටිමි, මම ඉල්ලා සිටිමි, යතුරු මත පිටු සැකසීම සඳහා ස්වදේශීය සහය ලබා දෙන ලෙස මම ඔබෙන් ඉල්ලා සිටිමි. ඔබට ප්රශ්න ඇත්නම් හෝ උදව් අවශ්ය නම්, මම උදව් කිරීමට සතුටු වෙමි (
යතුරු මගින් පිටු සැකසීමට සහය දැක්වීමට සුදුසු යැයි ඔබ සිතන සූදානම් කළ විසඳුම් භාවිතා කරන්නේ නම්, ඉල්ලීමක් සාදන්න හෝ හැකි නම් සූදානම් කළ විසඳුමක් ඉදිරිපත් කරන්න. ඔබට මෙම ලිපියට සම්බන්ධ වීමටද හැකිය.
නිගමනය
යතුරු මගින් පේජින් කිරීම වැනි සරල හා ප්රයෝජනවත් ප්රවේශයක් පුලුල්ව පැතිර නොයාමට හේතුව එය තාක්ෂණිකව ක්රියාත්මක කිරීමට අපහසු වීම හෝ විශාල උත්සාහයක් අවශ්ය වීම නොවේ. ප්රධාන හේතුව නම් බොහෝ අය ඕෆ්සෙට් දැකීමට සහ වැඩ කිරීමට පුරුදු වී සිටීමයි - මෙම ප්රවේශය සම්මතයෙන් ම නියම කර ඇත.
එහි ප්රතිඵලයක් වශයෙන්, පේජිනේෂන් සඳහා ප්රවේශය වෙනස් කිරීම ගැන ස්වල්ප දෙනෙක් සිතන අතර, මේ නිසා, රාමු සහ පුස්තකාලවල උපකරණ සහාය දුර්වල ලෙස වර්ධනය වෙමින් පවතී. එබැවින්, offset-free pagination හි අදහස සහ ඉලක්කය ඔබට සමීප නම්, එය පැතිරවීමට උදවු කරන්න!
මූලාශ්රය:
කර්තෘ: Markus Winand
මූලාශ්රය: www.habr.com