PostgreSQL рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рд░реЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рд╕реЗрд╡рд╛

рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕реЗрд╡рд╛ рдЙрджреНрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬрд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдмрдирд╛рдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдиреА рдХреЗ рд╡рд░рд┐рд╖реНрда рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрд░реНрддрд╡реНрдпреЛрдВ рд╕рд╣рд┐рдд рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реВрдВред рд╣рдо рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдФрд░ API рдХреЗ рд▓рд┐рдП рд░реВрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд░реВрдмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрдВрджрд░ рдорд╛рдирдХ рд╡реЗрдм-рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓ рдкреЗрдЬ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + Redux, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо PostgreSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рдорд╛рди рд╕реНрдЯреИрдХ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рдкреНрд░рд╢реНрди рд╣реИрдВ рдФрд░ рдореИрдВ рдХрд╣рд╛рдиреА рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдордиреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдорд╛рдирдХ рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╕рд░рд▓ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд┐рдПред


рд╣рдорд╛рд░рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рдпреВрдПрд╕ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ HIPAA рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕реБрд░рдХреНрд╖рд╛ рдСрдбрд┐рдЯ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╣рдореЗрд╢рд╛ рддреИрдпрд╛рд░ рд░рд╣рддреЗ рд╣реИрдВред рдЬреЛрдЦрд┐рдореЛрдВ рдФрд░ рд▓рд╛рдЧрддреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╣рд░реЛрдХреВ рдХреЗ рд╕рдорд╛рди рд╣реИред рдПрдХ рддрд░рдл рдпрд╣ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдордВрдЪ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдорд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╢реАрдШреНрд░ рд╣реА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд╣рдо рдЕрд╕реАрдо рдкреИрдорд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдПрдХ рд╕рдлрд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рд╣рд░ рдорд╣реАрдиреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЛрдЧреБрдиреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рджрд┐рди рд╣рдорд╛рд░реА рдирд┐рдЧрд░рд╛рдиреА рдиреЗ рд╣рдореЗрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдкрд░ рдбрд┐рд╕реНрдХ рдЖрдИрдУ рдХреЛрдЯрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдереЗред рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ AWS рдиреЗ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИред рд░реВрдмреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпреВрдирд┐рдХреЙрд░реНрди рд╢реНрд░рдорд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛ рд░рд╣реЗ рдереЗ, рдЧреНрд░рд╛рд╣рдХ рдирд╛рдЦреБрд╢ рдереЗред


рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди


рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВрдиреЗ "рдЧреИрд░ рдорд╛рдирдХ рдЕрдиреБрдХреВрд▓рди" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдХрдо-рдлрд╛рдВрд╕реА рд╡рд╛рд▓реЗ рдлрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдард╛рдП рдЧрдП рдереЗ:


  • рд╣рдордиреЗ рд╕рднреА рдПрди + 1 рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред рд░реВрдмреА рд░рддреНрди рдмреБрд▓реЗрдЯ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдХрд░рдг рдерд╛
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕реВрдЪрдХ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣рдЯрд╛рдП рдЧрдП рдереЗ, рдзрдиреНрдпрд╡рд╛рдж pg_stat_statements рдХреЗ рд▓рд┐рдП
  • рдХрдИ рдЬреЛрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреНрд░рд╢реНрди рдмреЗрд╣рддрд░ рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ
  • рд╣рдордиреЗ рд╕рдЬрд╛рд╡рдЯ рдкреНрд░рд╢реНрдиреЛрдВ рд╕реЗ рдкреГрд╖реНрдард╛рдВрдХрд┐рдд рд╕рдВрдЧреНрд░рд╣ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реБрд░реВ рдореЗрдВ рд╣рдордиреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдХрд░ рдкреНрд░рддрд┐ рд╕рдВрд╡рд╛рдж рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЧрд▓реА рдХреНрд╡реЗрд░реА рдЗрдВрдбреЗрдХреНрд╕ рдУрдирд▓реА рд╕реНрдХреИрди рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╕реНрддреА рд╣реИ:

SELECT COUNT(1), dialog_id FROM messages WHERE dialog_id IN (1, 2, 3, 4) GROUP BY dialog_id; 

  • рдХреБрдЫ рдХреИрд╢ рдЬреЛрдбрд╝реЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрджреЗрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЕрдкрдбреЗрдЯ рд╣реИрдВ

рдЗрди рд╕рднреА рдЪрд╛рд▓реЛрдВ рдиреЗ рдПрдХ-рджреЛ рдорд╣реАрдиреЗ рддрдХ рд╢рд╛рдирджрд╛рд░ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛, рдЬрдм рддрдХ рдХрд┐ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд╡рд╣реА рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реБрдИ - рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЕрдзрд┐рдХ рднрд╛рд░ред рд╣рдо рдХреБрдЫ рдФрд░ рдвреВрдВрдв рд░рд╣реЗ рдереЗред


рдЙрдиреНрдирдд рд╕рдорд╛рдзрд╛рди


рд╣рдо рднрд╛рд░реА рддреЛрдкрдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдФрд░ рд╡рд┐рдХреЗрдВрджреНрд░реАрдХрд░рдг рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЧрд╣рди рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЯреАрдо рдХреЗ рдлрд╝реЛрдХрд╕ рдХреЛ рд░рдЦрд░рдЦрд╛рд╡ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЕрдВрдд рддрдХ рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ PostgreSQL 9.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рд╡рд┐рднрд╛рдЬрди рдЕрдкрдиреА рд╕рднреА рд▓рд╛рдЧрддреЛрдВ рдХреЗ рд╕рд╛рде рдЯреНрд░рд┐рдЧрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ KISS рд╕рд┐рджреНрдзрд╛рдВрддред


рдХрд╕реНрдЯрдо рд╕рдорд╛рдзрд╛рди


рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░реЗрдВ


рд╣рдордиреЗ рдореБрдЦреНрдп рд▓рдХреНрд╖рдг - рдбрд┐рд╕реНрдХ IO рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЬрд┐рддрдирд╛ рдХрдо рдбреЗрдЯрд╛ рд╣рдо рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЙрддрдиреА рд╣реА рдХрдо IO рдХреНрд╖рдорддрд╛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рд╣рдордиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░реЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреА рдФрд░ рдкрд╣рд▓реЗ рдЙрдореНрдореАрджрд╡рд╛рд░ user_type рджреНрд╡рд╛рд░рд╛ polymorphic рд╕рдВрдШреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП user_type рдЬреИрд╕реЗ рдХреЙрд▓рдо рдереЗред рдЖрд╡реЗрджрди рдореЗрдВ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ Module::SubModule::ModelName рдЬреИрд╕реЗ Module::SubModule::ModelName рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ Module::SubModule::ModelName рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ - рдЗрди рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ varchar рд╕реЗ ENUM рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рд░реЗрд▓ рдкреНрд░рд╡рд╛рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 class AddUserEnumType < ActiveRecord::Migration[5.2] disable_ddl_transaction! def up ActiveRecord::Base.connection.execute <<~SQL CREATE TYPE user_type_enum AS ENUM ( 'Module::Submodule::UserModel1', 'Module::Submodule::UserModel2', 'Module::Submodule::UserModel3' ); SQL add_column :messages, :sender_type_temp, :user_type_enum Message .in_batches(of: 10000) .update_all('sender_type_temp = sender_type::user_type_enum') safety_assured do rename_column :messages, :sender_type, :sender_type_old rename_column :messages, :sender_type_temp, :sender_type end end end 

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рд╡рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдиреЛрдЯреНрд╕ рдЬреЛ рд░реЗрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ:


  • disable_ddl_transaction! рд▓реЗрди-рджреЗрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╣рдо рд▓рдВрдмреЗ рд▓реЗрдирджреЗрди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкрд░ рд▓реЗрдирджреЗрди рдХреЛ рдЕрдХреНрд╖рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • рдкрд╣рд▓реЗ рдХрджрдо рдкрд░ рд╣рдо PostgreSQL рдкрд░ рдПрдХ рдирдпрд╛ ENUM рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВред ENUM рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЖрдХрд╛рд░ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ varchar рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реИред ENUM рдХреЛ рдирдП рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рд╣рдо рдЕрдХреНрд╕рд░ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
  • user_type_enum рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕реНрддрдВрдн рдкреНрд░реЗрд╖рдХ_type_temp рдЬреЛрдбрд╝реЗрдВ
  • рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рд▓рдВрдмреЗ рд▓реЙрдХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдХреЙрд▓рдо in_batches рдореЗрдВ рдорд╛рди рднрд░реЗрдВ
  • рдЕрдВрддрд┐рдо рдЪрд░рдг рдирдП рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рдХреЙрд▓рдо рдХреЛ рд╕реНрд╡реИрдк рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЦрддрд░рдирд╛рдХ рдХрджрдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╕реНрддрдВрдн рдкреНрд░реЗрд╖рдХ_рдЯрд╛рдЗрдк рдкреНрд░реЗрд╖рдХ_type_old рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЗрд╖рдХ_type_temp рдкреНрд░реЗрд╖рдХ_type рдмрдирдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рд╣рдореЗрдВ рдмрд╣реБрдд рд╕реА рдкрд░реЗрд╢рд╛рдирд┐рдпрд╛рдБ рдорд┐рд▓реЗрдВрдЧреАред
  • safety_assured рд░рддреНрди рдордЬрдмреВрдд_ рдкреНрд░рд╡рд╛рд╕рди рд╕реЗ рдЖрддрд╛ рд╣реИ рдЬреЛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд┐рдЦрдиреЗ рдкрд░ рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдирд╛рдо рдмрджрд▓рдирд╛ рдХреЙрд▓рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреА рдереА рдХрд┐ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рдереЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣рд╛рдБ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд▓реЗрдХрд┐рди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рддреИрдирд╛рддреА рд╕рд╣рд┐рдд рд░рд╛рд╕реНрддрд╛ рд╣реИред

рдпрд╣ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЙрдЪрд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдХрдо рдЧрддрд┐рд╡рд┐рдзрд┐ рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди рд╕рднреА рд╕рдорд╛рди рдкрд▓рд╛рдпрди рдЪрд▓рд╛рддреЗ рд╣реИрдВред


рд╣рдордиреЗ рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдХреЛ ENUM рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдкреБрд░рд╛рдиреЗ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ рд╡рд┐рдЦрдВрдбрди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП VACUUM рдХреЛ рдЪрд▓рд╛рдпрд╛ред рдЗрд╕рдиреЗ рд╣рдореЗрдВ рдХреБрд▓ рдбрд┐рд╕реНрдХ рд╕реНрдкреЗрд╕ рдХрд╛ рд▓рдЧрднрдЧ 10% рдмрдЪрд╛ рд▓рд┐рдпрд╛ рд▓реЗрдХрд┐рди
рдХреБрдЫ рд╕реНрддрдВрднреЛрдВ рд╡рд╛рд▓реА рдХреБрдЫ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рджреЛ рдмрд╛рд░ рд╕рдВрдХреБрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛! рдХреНрдпрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдерд╛ - PostgreSQL рджреНрд╡рд╛рд░рд╛ рдХреБрдЫ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдХреИрд╢реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ (рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдзрд┐рдХ рд░реИрдо рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЗрд╕рдиреЗ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбрд┐рд╕реНрдХ рдЖрдИрдУ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ред


рдЕрдкрдиреЗ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рди рдХрд░реЗрдВ


рдПрдХ рдФрд░ рдмрд╛рдд рд▓реЗрдЦ рдореЗрдВ рдкрд╛рдИ рдЧрдИ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдПрдХрд▓ PostgreSQL рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдореЗрдВ 50x рддрдХ рд╕реБрдЪрд╛рд░реВ рдХреНрд╡реЗрд░реА рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ - рд╣рдорд╛рд░реЗ PostgreSQL рдкреНрд░рджрд╛рддрд╛ рд░реИрдо, рдбрд┐рд╕реНрдХ рдФрд░ рд╕реАрдкреАрдпреВ рдХреЗ рдЕрдиреБрд░реЛрдзрд┐рдд рдорд╛рддреНрд░рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рднреА рдХрд╛рд░рдг рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ random_03cost рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдЬреЛ HDD рдХреЗ рд▓рд┐рдП 4 рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред рд╡реЗ рд╣рдорд╕реЗ SSD рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд▓реНрдХ рд▓реЗрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди PostgreSQL рдХреЛ рдареАрдХ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдмреЗрд╣рддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдорд┐рд▓реА:


 EXPLAIN ANALYSE SELECT COUNT(*) AS count_dialog_id, dialog_id as dialog_id FROM messages WHERE sender_type = 'Module::Submodule::UserModel1' AND sender_id = 1234 GROUP BY dialog_id; db=# SET random_page_cost = 4; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=76405.45..76411.92 rows=647 width=12) (actual time=2428.412..2428.420 rows=12 loops=1) Group Key: dialog_id -> Bitmap Heap Scan on messages (cost=605.90..76287.72 rows=23545 width=4) (actual time=82.442..2376.033 rows=79466 loops=1) Recheck Cond: ((sender_id = 1234) AND (sender_type = 'Module::Submodule::UserModel1'::user_type_enum)) Heap Blocks: exact=23672 -> Bitmap Index Scan on index_messages_on_sender_id_and_sender_type_and_message_type (cost=0.00..600.01 rows=23545 width=0) (actual time=76.067..76.068 rows=79466 loops=1) Index Cond: ((sender_id = 1234) AND (sender_type = 'Module::Submodule::UserModel1'::user_type_enum)) Planning time: 3.849 ms Execution time: 2428.691 ms (9 rows) db=# SET random_page_cost = 1; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ HashAggregate (cost=21359.54..21366.01 rows=647 width=12) (actual time=97.905..97.913 rows=12 loops=1) Group Key: dialog_id -> Index Scan using index_messages_on_sender_id_and_sender_type_and_message_type on messages (cost=0.56..21241.81 rows=23545 width=4) (actual time=0.058..60.444 rows=79466 loops=1) Index Cond: ((sender_id = 1234) AND (sender_type = 'Module::Submodule::UserModel1'::user_type_enum)) Planning time: 0.277 ms Execution time: 98.070 ms (6 rows) 

рдбреЗрдЯрд╛ рджреВрд░ рд▓реЗ рдЬрд╛рдПрдВ


рд╣рдо рдПрдХ рд╡рд┐рд╢рд╛рд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреВрд╕рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЗ рдЧрдПред рд╣рдореЗрдВ рдХрд╛рдиреВрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╣рд░ рдмрджрд▓рд╛рд╡ рдХреЗ рдСрдбрд┐рдЯ рдХреЛ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рддреНрди рдкреЗрдкрд░рдЯреНрд░реЗрд▓ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреА ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрддреНрдкрд╛рджрди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рддрд╣рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдорд▓реНрдЯреАрд╡рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ - рдпрд╣ рд░реЗрд▓реНрд╕ 6. рдХреА рдПрдХ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИред рдХреБрдЫ рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИрдВ:


рдлрд╝рд╛рдЗрд▓ config/database.yml рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди config/database.yml


 external_default: &external_default url: "<%= ENV['AUDIT_DATABASE_URL'] %>" external_development: <<: *external_default 

рдЕрдиреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ ActiveRecord рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕:


 class ExternalRecord < ActiveRecord::Base self.abstract_class = true establish_connection :"external_#{Rails.env}" end 

рдореЙрдбрд▓ рдЬреЛ рдкреЗрдкрд░рдЯреНрд░реЗрд▓ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:


 class ExternalVersion < ExternalRecord include PaperTrail::VersionConcern end 

рдСрдбрд┐рдЯ рдХреЗ рддрд╣рдд рдореЙрдбрд▓ рдореЗрдВ рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 class Message < ActiveRecord::Base has_paper_trail class_name: "ExternalVersion" end 

рд╕рд╛рд░рд╛рдВрд╢


рд╣рдордиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЕрдкрдиреЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдХреНрдпреВрдПрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдзрд┐рдХ рд░реИрдо рдЬреЛрдбрд╝рд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдЙрдкрд▓рдмреНрдз рдбрд┐рд╕реНрдХ рдЖрдИрдУ рдХреЗ рдХреЗрд╡рд▓ 10% рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рдмрдЪ рдЧрдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджрди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ - рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдбреЗрдЯрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рд▓реЗ рдЧрдПред рд╕рдВрднрд╡рддрдГ, рдпреЗ рдЖрдкрдХреЗ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд╕реНрдЯрдо рдФрд░ рд╕рд░рд▓ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдорд╛рдирдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдордд рднреВрд▓рдирд╛ред


рдкреБрдирд╢реНрдЪ: рдЕрддреНрдпрдзрд┐рдХ psql рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди DBA рдРрдб-рдСрди рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi445426/


All Articles