Olery³ÉÁ¢ÓÚ2010Ä꣬×ܲ¿Î»ÓÚ°¢Ä·Ë¹Ìص¤¡£¸Ã³õ´´¹«Ë¾Îª¾ÆµêÐÐÒµÌṩÉùÓþ¹ÜÀíÓëýÌå¼à¿Ø¹¤¾ß£¬°ïÖú¾Æµê½«ÍøÂçÆÀÂÛºÍÉ罻ýÌå·´À¡×ª»¯³É¿ÉÖ´ÐеÄÉÌÒµÖÇÄÜ·ÖÎö¡£
Olery³ÉÁ¢×î³õÊÇʹÓÃMySQLÀ´´æ´¢(Óû§¡¢ºÏͬµÈµÈ)ºËÐÄÊý¾Ý£¬ÓÃMongoDBÀ´´æ´¢ÆÀÂÛ¼°ÆäÀàËÆµÄÊý¾Ý(¼´ÄÄЩÔÚÊý¾Ý¶ªÊ§µÄÇé¿öϺÜÈÝÒ×»Ö¸´µÄÊý¾Ý)¡£Ò»¿ªÊ¼£¬ÕâÑùµÄ°²×°ÔËÐеķdz£ºÃ£¬È»¶ø£¬Ëæ×Ź«Ë¾µÄ³É³¤£¬¿ªÊ¼Óöµ½Á˸÷ÖÖ¸÷ÑùµÄÎÊÌ⣬ÓÈÆäÊÇMongoDBµÄÎÊÌâ¾Ó¶à¡£ÆäÖÐһЩÎÊÌâÊÇÓÉÓÚÓ¦ÓÃÓëÊý¾Ý¿âµÄ½»»¥·½Ê½¶øÒýÆðµÄ£¬Ò»Ð©ÔòÊÇÓÉÊý¾Ý¿â±¾Éí¶ø²úÉúµÄ¡£
ÀýÈ磬ij¸öʱ¿Ì£¬OleryÐèÒª´ÓMongoDBÖÐɾ³ýÒ»°ÙÍò¸öÎĵµ£¬ÒÔºóÔÙ°ÑÕâЩÊý¾ÝÖØÐ²åÈëµ½MongoDBÀï¡£ÕâÑùµÄ´¦Àí·½·¨Ê¹µÃÕû¸öÊý¾Ý¿â¼¸ºõÒª±»Ëø¶¨Êý¸öСʱ£¬×ÔÈ»·þÎñÐÔÄܾͻήµÍ¡£¶øÇÒÖ±µ½¶ÔÊý¾Ý¿âÖ´ÐÐÐÞ¸´(¼´ÔÚ
MongoDBÉÏÖ´ÐÐrepairDatabaseÃüÁî)ºó²Å»á½âËø¡£¶øÇÒÍê³ÉÐÞ¸´»¹Òª»¨·ÑÊý¸öСʱ£¬ÐÞ¸´Ëù»¨µÄСʱÊýÒª¸ù¾ÝÊý¾Ý¿âµÄ´óСÀ´È·¶¨¡£
ÔÚÁíһʵÀýÖÐOlery×¢Òâµ½Ó¦ÓóÌÐòµÄÐÔÄܽµµÍºÍÉè·¨¸ú×Ùµ½µÄ MongoDB ¼¯Èº¡£È»¶ø£¬¾¹ý½øÒ»²½¼ì²é£¬ÎÞ·¨ÕÒµ½ÎÊÌâµÄÕæÕýÔÒò¡£ÎÞÂÛÔõô°²×°£¬»òʹÓÃʲô¹¤¾ßÇÃÁËʲôÃüÁî¶¼ÕÒ²»µ½ÔÒò¡£Ö±µ½Olery¸ü»»Á˼¯ÈºµÄ³õÑ¡£¬ÐÔÄܲŻָ´Õý³£¡£
ÕâÖ»ÊÇÁ½¸öÀý×Ó£¬OleryÒѾÓйýÐí¶àÕâÑùµÄÇé¿ö¡£Õâ¸öÎÊÌâµÄºËÐÄÊÇ£¬Õâ²»Ö»Êý¾Ý¿âÔÚÔËÐУ¬¶øÇÒÎÞÂÛºÎʱ²ì¿´Ëü¶¼Ã»Óоø¶ÔµÄ¼£Ïó±íÃ÷ÊÇʲôÔÒòµ¼ÖµÄÎÊÌâ¡£
ÎÞģʽµÄÎÊÌâ
ÁíÍ⣬OleryÃæ¶ÔµÄºËÐÄÎÊÌâÊÇmongoDBµÄÖØÒªÌØÕ÷Ö®Ò»£ºÄ£Ê½µÄȱ·¦¡£Ä£Ê½µÄȱ·¦¿ÉÄÜÌýÆðÀ´ÊÇÓÐȤµÄ£¬²¢ÇÒÔÚһЩÇé¿öÏÂÊÇÓкô¦µÄ¡£È»¶ø£¬¶ÔÓÚÐí¶àÎÞģʽ´æ´¢ÒýÇæµÄÓ÷¨£¬Æäµ¼ÖÂÁËһЩģʽ֮¼äµÄÄÚ²¿ÎÊÌâ¡£ÕâЩģʽûÓÐͨ¹ý´æ´¢ÒýÇæ¶¨Òå¶øÊÇͨ¹ýÓ¦ÓõÄÐÐΪ¼°Æä¿ÉÄܵÄÐèÒª¶ø¶¨ÒåµÄ¡£
ÀýÈ磺Äã¿ÉÄÜÓÐÒ»Ò³´æ´¢ÄãµÄÓ¦ÓÃÐèÒªµÄ×Ö·û´®ÀàÐ͵Ätitle×ֶεļ¯ºÏ¡£Õâ¶ùÕâ¸öģʽÊǷdz£·ûºÏµ±Ç°ÇéÐε쬼´Ê¹ËüûÓб»Ã÷È·µÄ¶¨Òå¡£µ«Èç¹ûÕâ¸öÊý¾Ý½á¹û¸Ä±ä³¬Ê±£¬ÓÈÆäÊÇÈç¹ûÔÀ´µÄÊý¾ÝûÓб»Ç¨ÒƵ½ÐµÄÊý¾Ý½á¹¹£¬Õâ¾Í³ÉÁËÎÊÌâ(ÔÚһЩÎÞģʽµÄ´æ´¢ÒýÇæÉÏÊÇÏ൱ÓÐÎÊÌâµÄ)¡£ÀýÈ磬Äã¿ÉÄÜÓÐÏÂÃæÕâÑùµÄ
Ruby´úÂ룺
post_slug = post.title.downcase.gsub(/\W+/, '-') |
ÕâÑù£¬Õë¶Ôÿһ¸öÓС°title¡±×ֶβ¢·µ»ØÒ»¸öStringµÄÎĵµ£¬Ëü¶¼ÄÜÕý³£¹¤×÷¡£È»¶ø£¬¶ÔÓÚÄÇЩʹÓò»Í¬×Ö¶ÎÃû×Ö(ÀýÈ磺post_title)»òÕ߸ù±¾Ã»ÓбêÌâ×ֶεÄÎĵµÀ´Ëµ£¬Ëü½«²»ÄÜÕý³£¹¤×÷¡£ÎªÁË´¦ÀíÕâÖÖÇé¿ö£¬ÄãÐèÒª½«´úÂëµ÷ÕûΪÏÂÃæÄÚÈÝ£º
if post.title post_slug = post.title.downcase.gsub(/\W+/, '-') else # ... end |
ÁíÒ»ÖÖ´¦Àí·½·¨ÊÇ£¬ÔÚÄãµÄÄ£ÐÍÖж¨ÒåÒ»¸öģʽ¡£ÀýÈç Mongoid£¬Ò»¸öÁ÷ÐеÄÕë¶ÔRubyµÄMongoDB
ODM£¬¾ÍÄÜÈÃÄã×öµ½ÕâÒ»µã¡£È»¶ø£¬µ±Ê¹ÓÃÕâЩ¹¤¾ß¶¨ÒåÒ»¸öģʽʱ£¬Äã¿ÉÄÜ»áºÃÆæÎªÊ²Ã´ËüÃDz»ÔÚÊý¾Ý¿âÄÚ¶¨Òå¸Ãģʽ¡£Êµ¼ÊÉÏ£¬ÕâÑù×ö¿ÉÒÔ½â¾öÁíÒ»¸öÎÊÌ⣺¿ÉÖØÓÃÐÔ¡£Èç¹ûÄãÖ»ÓÐÒ»¸öÓ¦ÓóÌÐò£¬ÄÇôÔÚ´úÂëÖж¨Òåģʽ²¢²»ÊÇʲô´óÎÊÌ⡣Ȼ¶ø£¬Èç¹ûÄãÓÐÐí¶àÓ¦ÓóÌÐòµÄ»°£¬Õ⽫ºÜ¿ì»á³ÉΪһ¸ö´óÂé·³¡£
ÎÞģʽ´æ´¢ÒýÇæÏ£Íûͨ¹ýɾ³ý¶ÔģʽµÄÏÞÖÆµÄ·½Ê½£¬ÈÃÄãµÄ¹¤×÷±äµÃ¸ü¼òµ¥¡£µ«ÏÖʵµÄÇé¿öÊÇ£¬È·±£Êý¾ÝÒ»ÖÂÐÔµÄÔðÈÎÍÆµ½ÁËÓû§×Ô¼ºµÄÉíÉÏ¡£ÓÐʱºòÎÞģʽÒýÇæ¿ÉÒÔ¹¤×÷£¬µ«ÎÒ´ò¶Ä£¬¸ü¶àµÄʱºòÊÇÊÂÓëԸΥ¡£
ºÃÊý¾Ý¿âµÄÐèÇó
ÓÐÁ˸ü¶àµÄÌØÊâÐèÇóºó£¬ÆÈʹOleryѰÇóÒ»¿î¸üºÃµÄÊý¾Ý¿âÀ´½â¾öÎÊÌâ¡£¶ÔÓÚϵͳ£¬ÌرðÊÇÊý¾Ý¿â£¬Olery·Ç³£×¢ÖØÒÔϼ¸µã:
1.Ò»ÖÂÐÔ
2.Êý¾ÝºÍϵͳÐÐΪµÄ¿ÉÊÓ»¯
3.ÕýÈ·ÐÔºÍÃ÷È·ÐÔ
4.¿ÉÍØÕ¹
Ò»ÖÂÐÔÊÇÖØÒªµÄÔÚÓÚËüÓÐÖúÓÚ°ïÖúOlery¶ÔϵͳÉ趨Ã÷È·µÄÆÚÍû¡£Èç¹ûÊý¾Ý×ÜÊǰ´ÕÕͬÑùµÄ·½Ê½´æ´¢£¬ÄÇôϵͳ¿ÉÒԺܷ½±ãµÄʹÓÃÕâЩÊý¾Ý¡£Èç¹ûÔÚÊý¾Ý¿â²ãÃæÒªÇó±íµÄĪһÁбØÐë´æÔÚ£¬ÄÇôÔÚÓ¦ÓòãÃæ¾Í²»Óüì²éÕâÁÐÊý¾ÝÊÇ·ñ´æÔÚ¡£Êý¾Ý¿â¼´Ê¹ÊµÔÚ¸ßѹÇé¿öÏ£¬Ò²±ØÐ뱣֤ÿһ´Î²Ù×÷µÄÍêÕûÐÔ¡£Ã»ÓÐʲôÊÂÇé±Èµ¥´¿µÄ²åÈëÊý¾Ý£¬¹ýÁ˼¸·ÖÖÓºóÈ´ÕÒ²»µ½Êý¾ÝµÄʸüÈÃÈ˾ÚÉ¥ÁË¡£
¿É¼ûÐÔ°üº¬ÁËÁ½µã£ºÏµÍ³±¾ÉíÒÔ¼°´ÓÖлñÈ¡Êý¾ÝµÄÈÝÒ׳̶ȡ£Èç¹ûÒ»¸öϵͳ³ö´íÄÇôӦ¸ÃÒ×ÓÚµ÷ÊÔ¡£·´¹ýÀ´£¬Óû§Ó¦ºÜÈÝÒײ鵽ÏëÒª²éѯµÄÊý¾Ý¡£
ÕýÈ·ÐÔÊÇָϵͳµÄÐÐΪÈçOleryËùÆÚÍûµÄÄÇÑù¡£Èç¹ûij¸ö×ֶζ¨ÒåΪһ¸öÊýÖµÐÍ£¬Ã»ÓÐÈË¿ÉÒÔÏñÆäÖвåÈëÎı¾¡£Õâ·½ÃæMySQLÊdzôÃûÕÑÖø£¬Ò»µ©ÄãÕâÑù×öÄ㽫µÃµ½Î±½á¹û¡£
¿ÉÀ©Õ¹ÐÔ²»½öÕë¶ÔÐÔÄܶøÑÔ£¬¶øÇÒÒ²Éæ¼°²ÆÎñ·½ÃæºÍϵͳÄܹ»¶àôºÃµØÓ¦¶Ô²»¶Ï±ä»¯µÄÐèÇó¡£Ò»¸öϵͳÔÚûÓдóÁ¿×ʽð³É±¾»ò¼õ»ºÏµÍ³ËùÒÀÀµµÄ¿ª·¢ÖÜÆÚÇé¿öÏ£¬ºÜÄѱíÏֵ÷dz£ºÃ¡£
·ÅÆúMongoDB
ÉÏÃæµÄÐèÇóÀμÇÓÚÐĺó£¬Olery¾Í¿ªÊ¼Ñ°ÕÒÒ»¸öÈ¡´úMongoDBµÄÊý¾Ý¿â¡£ÉÏÃæÌáµ½µÄÌØÐÔͨ³£ÊÇ´«Í³RDBMÌØÕ÷µÄÒ»×éºËÐ¬ËùÒÔOleryËø¶¨ÁËÁ½¸öºòÑ¡ÕߣºMySQLºÍPostgreSQL¡£
±¾À´£¬MySQLÊǵÚÒ»ºòÑ¡£¬ÒòΪOleryµÄһЩ¹Ø¼üÊý¾ÝÒѾÔÚʹÓÃËü´æ´¢¡£È»¶ø£¬MySQLÒ²ÓÐһЩÎÊÌâ¡£ÀýÈ磬µ±½«Ò»¸ö×ֶζ¨ÒåΪint(11)ʱ£¬ÄãÈ´¿ÉÒÔÇáËɵØÏò¸Ã×ֶβåÈëÎı¾Êý¾Ý£¬ÒòΪMySQL»áÊÔͼ¶ÔËü½øÐÐת»»¡£ÏÂÃæÊÇһЩÀý×Ó£º
mysql> create table example ( `number` int(11) not null ); Query OK, 0 rows affected (0.08 sec) mysql> insert into example (number) values (10); Query OK, 1 row affected (0.08 sec) mysql> insert into example (number) values ('wat'); Query OK, 1 row affected, 1 warning (0.10 sec) mysql> insert into example (number) values ('what is this 10 nonsense'); Query OK, 1 row affected, 1 warning (0.14 sec) mysql> insert into example (number) values ('10 a'); Query OK, 1 row affected, 1 warning (0.09 sec) mysql> select * from example; +--------+ | number | +--------+ | 10 | | 0 | | 0 | | 10 | +--------+ 4 rows in set (0.00 sec) |
ÖµµÃ×¢ÒâµÄÊÇ£¬MySQLÔÚÕâЩÇé¿öÏ»ᷢ³ö¾¯¸æ¡£µ«ÊÇ£¬½ö½öÊǾ¯¸æ¶øÒÑ£¬ËüÃÇͨ³£(Èô·Ç×ÜÊÇ)»á±»ºöÂÔ¡£
´ËÍ⣬MySQLµÄÁíÒ»¸öÎÊÌâÊÇ£¬ÈκαíµÄÐ޸IJÙ×÷(ÀýÈ磺Ìí¼ÓÒ»ÁÐ)¶¼»áµ¼ÖÂ±í±»Ëø£¬´Ëʱ½«ÎÞ·¨½øÐжÁ»òд²Ù×÷¡£Õâ¾ÍÒâζ×Å£¬Ê¹ÓÃÕâÖÖ±íµÄÈκβÙ×÷¶¼²»µÃ²»µÈ´ýÐÞ¸ÄÍê³ÉÖ®ºó²ÅÄܽøÐС£¶ÔÓÚ°üº¬ÓдóÁ¿Êý¾ÝµÄ±í£¬Õâ¿ÉÄܻỨ·Ñ¼¸¸öСʱ²ÅÄÜÍê³É£¬ºÜ¿ÉÄܻᵼÖÂÓ¦ÓóÌÐòå´»ú¡£ÕâÒѾµ¼ÖÂһЩ¹«Ë¾(ÀýÈç
SoundCloud)²»µÃ²»×Ô¼º¿ª·¢¹¤¾ß(ÀýÈçlhm)À´½â¾ö¸ÃÎÊÌâ¡£
Á˽⵽ÉÏÃæµÄÎÊÌâºó£¬Olery¿ªÊ¼¿¼²ìPostgreSQL¡£PostgreSQL¿ÉÒÔ½â¾öºÜ¶àMySQL²»Äܽâ¾öµÄÎÊÌâ¡£ÀýÈ磬PostgreSQLÖÐÄã²»Äܽ«Îı¾Êý¾Ý²åÈëÒ»¸öÊý×Ö×ֶΣº
olery_development=# create table example ( number int not null ); CREATE TABLE olery_development=# insert into example (number) values (10); INSERT 0 1 olery_development=# insert into example (number) values ('wat'); ERROR: invalid input syntax for integer: "wat" LINE 1: insert into example (number) values ('wat'); ^ olery_development=# insert into example (number) values ('what is this 10 nonsense'); ERROR: invalid input syntax for integer: "what is this 10 nonsense" LINE 1: insert into example (number) values ('what is this 10 nonsen... ^ olery_development=# insert into example (number) values ('10 a'); ERROR: invalid input syntax for integer: "10 a" LINE 1: insert into example (number) values ('10 a'); |
PostgreSQL »¹¾ßÓÐÔÚÐí¶à·½Ê½Öв»ÐèҪÿһ¸ö²Ù×÷¶¼ÉÏËø¾Í¿ÉÒÔ¸Äд±íµÄÄÜÁ¦¡£ÀýÈ磬Ìí¼ÓÒ»ÁÐûÓÐĬÈÏֵȴ¿ÉÒÔÉèÖÃΪnullµÄÁв¢Äܹ»¿ìËÙÍê³ÉÎÞÐèËø¶¨Õû¸ö±í¡£
»¹ÓÐÆäËû¸÷ÖÖÓÐȤµÄ¹¦ÄÜ£¬ÈçÔÚ PostgreSQL ¿ÉÒÔ£ºtrigram Ϊ»ù´¡µÄË÷ÒýºÍ¼ìË÷£¬È«ÎļìË÷£¬Ö§³ÖJSON²éѯ£¬Ö§³Ö²éѯ/´æ´¢¼ü-Öµ¶Ô£¬Ö§³Ö·¢²¼/¶©Ôĵȸü¶à¡£
×îÖØÒªµÄÊÇPostgreSQLÔÚÐÔÄÜ£¬¿É¿¿ÐÔ£¬ÕýÈ·ÐÔºÍÒ»ÖÂÐÔÖ®¼äÄܹ»È¨ºâ¡£
Ç¨ÒÆµ½PostgreSQL
×îºó£¬ÎªÁËÔÚËù¹ØÐĵĸ÷ÖÖÏîĿ֮Öдﵽƽºâ£¬Olery¾ö¶¨Ê¹ÓÃPostgreSQL¡£µ«ÊÇ£¬½«Õû¸öƽ̨´ÓMongoDBÇ¨ÒÆµ½Ò»¸ö½ØÈ»²»Í¬µÄÊý¾Ý¿â²¢²»ÊǺÜÈÝÒ×µÄÊ¡£ÎªÁËÊ¹×ªÒÆ¹¤×÷¼òµ¥»¯£¬Olery½«´Ë¹ý³Ì·Ö³ÉÁË3¸ö²½Ö裺
1.´î½¨Ò»¸öPostgreSQLÊý¾Ý¿â£¬²¢Ç¨ÒÆÊý¾ÝµÄÒ»¸öС×Ó¼¯¡£
2.¸üÐÂËùÓÐÒÀÀµÓÚMongoDBµÄÓ¦ÓóÌÐò£¬Á¬Í¬ÈκÎÐèÒªµÄÖØ¹¹£¬¶¼ÓÃÒÀÀµÓÚPostgreSQLµÄ³ÌÐòÌæ´ú¡£
3.½«²úÆ·Êý¾ÝÇ¨ÒÆµ½ÐÂÊý¾Ý¿âÉÏ£¬È»ºó²¿ÊðÐÂÆ½Ì¨¡£
²¿·ÖÊý¾ÝÇ¨ÒÆ
ÔÚ¿¼ÂǰÑËùÓÐÊý¾ÝÇ¨ÒÆµ½ÐÂÊý¾Ý¿â֮ǰ£¬OleryÏÈÇ¨ÒÆÁËһС²¿·ÖÊý¾ÝÀ´×ö²âÊÔ¡£Èç¹û½ö½öÊÇÇ¨ÒÆÒ»Ð¡²¿·ÖÊý¾Ý£¬¾ÍÓзdz£¶àµÄÂé·³µÄ»°£¬ÄÇôÊý¾Ý¿âÇ¨ÒÆÒ²¾ÍûʲôÒâÒåÁË¡£
¾¡¹ÜÓÐÏֳɵŤ¾ß¿ÉÒÔÀûÓ㬵«»¹ÊÇÓÐЩÊý¾Ý(±ÈÈ磬ÁÐÖØÃüÃû£¬Êý¾ÝÀàÐͲ»Ò»ÖÂ)Òª×öת»»£¬¶ÔÓÚÕâЩÊý¾ÝOlery×Ô¼º¿ª·¢ÁËЩ¹¤¾ß¡£ÕâЩ¹¤¾ßÖУ¬´ó²¿·Ö¶¼ÊÇRubyдµÄÒ»´ÎÐԽŲ½£¬ÓÃÓÚɾ³ýһЩÆÀÂÛ£¬ÕûÀíÊý¾Ý±àÂ룬ÐÞÕýÖ÷¼ü·¢ÉúÐòÁеȵȡ£
ÔÚ²âÊÔ¿ªÊ¼½×¶Î¾¡¹ÜÓÐЩÊý¾ÝÉϵÄÎÊÌ⣬²¢Ã»ÓгöÏÖ´óµÄ»á×è°Ç¨ÒƵÄÎÊÌâ¡£ÀýÈ磬ÓÐЩÓû§Ìá½»µÄÊý¾ÝûÓÐÍêÈ«°´¸ñʽ±àÂ룬µ¼ÖÂÕâЩÊý¾Ý±»ÖØÐ±àÂë֮ǰ£¬²»Äܱ»µ¼Èëµ½ÐÂÊý¾Ý¿â¡£ÀýÍâÒ»¸öÓÐÒâ˼µÄ¸Ä±äÊÇ£¬Ö®Ç°ÆÀÂÛµÄÊý¾Ý´æµÄÊÇÆÀÂÛÓõÄÓïÑÔµÄÃû³Æ(Èç¡°ºÉÀ¼Ó£¬¡°Ó¢ÓµÈ)£¬ÏÖÔÚ¸ÄÁË´æÓïÑԵıàÂ룬ÒòΪ
OleryеÄÓïÒå·ÖÎöϵͳʹÓõÄÊÇÓïÑÔ±àÂ룬¶ø²»ÔÙÊÇÓïÑÔÃû³Æ¡£
¸üÐÂÓ¦ÓÃ
ĿǰΪֹ£¬»¨·Ñʱ¼ä×î¶àµÄ¾ÍÊǸüÐÂÓ¦Óã¬ÓÈÆäÊÇÄÇЩÑÏÖØÒÀÀµMongoDB¾ÛºÏ¿ò¼ÜµÄÓ¦Óá£ÈÓµôÄÇÉÙÊý¼¸¸öÒÅÁôµÄRailsÓ¦Óðɣ¬¹âÊDzâÊԾͻỨµôÄ㼸¸öÐÇÆÚµÄʱ¼ä¡£¸üÐÂÓ¦ÓõĹý³Ì´óÖÂÈçÏ£º
1.ÓÃPostgreSQLµÄÏà¹Ø´úÂëÀ´Ìæ»»µôMongoDBµÄÇý¶¯/ÉèÖÃÄ£¿éµÄ´úÂë
2.ÔËÐвâÊÔ
3.ÐÞ¸´Bugs
4.·´¸´ÔËÐвâÊÔ£¬Ö±µ½ËùÓвâÊÔͨ¹ý
¶ÔÓÚ·ÇRailsÓ¦Óã¬OleryÍÆ¼öʹÓà Sequel£¬¶ÔÓÚRailsÓ¦Óã¬OleryÏÖÔÚ»¹ÎÞ·¨°ÚÍÑActiveRecord(ÖÁÉÙÊÇÏÖÔÚ)¡£SequelÊÇÒ»¸ö·Ç³£ºÃµÄÊý¾Ý¿â¹¤¾ß¼¯£¬ËüÖ§³Ö¾ø´ó¶àÊý(Èç¹û²»ÊÇÈ«²¿)ÎÒÃÇÏëʹÓõÄPostgreSQLÌØÐÔ¡£Ïà½ÏÓÚActiveRecord£¬Ëü»ùÓÚDSLµÄqueryҪǿ´óµÄ¶à£¬¾¡¹Ü¿ÉÄܺÄʱ»áÓе㳤¡£
¾Ù¸öÀý×Ó£¬¼ÙÉèÄãÏë¼ÆËãÓжàÉÙÓû§Ê¹ÓÃijÖÖÓïÑÔ£¬²¢¼ÆËãÿÖÖÓïÑÔËùÕ¼µÄ±ÈÀý(Ïà¶ÔÓÚÕû¸ö¼¯ºÏ)¡£´¿´âµÄSQL²éѯÓï¾äÈçÏÂËùʾ£º
SELECT locale,count(*) AS amount, (count(*) / sum(count(*)) OVER ()) * 100.0 AS percentageFROM users GROUP BY localeORDER BY percentage DESC; ÔÚÎÒÃǵÄÀý×ÓÖУ¬½«»á²úÉúÒÔÏÂÊä³ö(µ±Ê¹ÓÃPostgreSQLÃüÁîÐнçÃæÊ±)£º locale | amount | percentage --------+--------+-------------------------- en | 2779 | 85.193133047210300429000 nl | 386 | 11.833231146535867566000 it | 40 | 1.226241569589209074000 de | 25 | 0.766400980993255671000 ru | 17 | 0.521152667075413857000 | 7 | 0.214592274678111588000 fr | 4 | 0.122624156958920907000 ja | 1 | 0.030656039239730227000 ar-AE | 1 | 0.030656039239730227000 eng | 1 | 0.030656039239730227000 zh-CN | 1 | 0.030656039239730227000 (11 rows) |
SequelÔÊÐíÄãʹÓô¿Ruby±àдÉÏÃæµÄ²éѯ£¬¶ø²»ÐèÒª×Ö·û´®·Ö¶Î(ActiveRecord¾³£ÐèÒª)£º
star = Sequel.lit('*')User.select(:locale) .select_append { count(star).as(:amount) } .select_append { ((count(star) / sum(count(star)).over) * 100.0).as(:percentage) } .group(:locale) .order(Sequel.desc(:percentage)) |
Èç¹ûÄ㲻ϲ»¶Ê¹Óá°Sequel.lit(¡°*¡±)¡±£¬ÄãÒ²¿ÉÒÔʹÓÃÏÂÃæµÄÓï·¨£º
User.select(:locale) .select_append { count(users.*).as(:amount) } .select_append { ((count(users.*) / sum(count(users.*)).over) * 100.0).as(:percentage) } .group(:locale) .order(Sequel.desc(:percentage)) |
ËäÈ»Õâ¿ÉÄÜÓÐЩÈß³¤£¬µ«ÊÇÉÏÃæµÄÁ½ÖÖ²éѯ¶¼Ê¹µÃËüÃǸüÒ×ÓÚÖØÓ㬶øÎÞÐè½øÐÐ×Ö·û´®Á¬½Ó¡£
δÀ´¿ÉÄÜÒ²»á½«OleryµÄRailsÓ¦ÓóÌÐòÇ¨ÒÆµ½Sequel£¬µ«ÊÇ¿¼Âǵ½RailsÓëActiveRecordñîºÏµÃÈç´Ë½ôÃÜ£¬ËùÒÔOlery»¹²»Íêȫȷ¶¨ÕâÊÇ·ñÖµµÃ»¨·Ñʱ¼äºÍ¾«Á¦¡£
Ç¨ÒÆÉú²úÊý¾Ý
×îÖÕOleryÀ´µ½Ç¨ÒÆÉú²úÊý¾ÝµÄ¹ý³Ì¡£Ò»°ãÓÐÁ½ÖÖ·½·¨À´×öÕâ¼þÊ£º
1.¹ØµôÕû¸öƽ̨£¬Ö±µ½ËùÓÐÊý¾Ý¶¼ÒÑÇ¨ÒÆÍê³É¡£
2.Ç¨ÒÆÊý¾ÝµÄͬʱ±£³ÖϵͳÔËÐС£
µÚÒ»¸öÑ¡Ïî¾ßÓÐÒ»¸öÃ÷ÏÔµÄȱµã£ºÍ£»úʱ¼ä¡£µÚ¶þ¸öÑ¡Ïî²»ÐèҪͣ»úµ«ÊǺÜÄÑ´¦Àí¡£ÀýÈ磬ÔÚÕâ¸ö·½°¸ÖУ¬µ±ÄãÇ¨ÒÆÊý¾ÝµÄͬʱ£¬Äã±ØÐëÒª¿¼ÂÇËùÓн«ÒªÌí¼ÓµÄÊý¾Ý£¬·ñÔòÄã¾Í»áËðʧÊý¾Ý¡£
ÐÒÔ˵ÄÊÇ£¬OleryÓÐÒ»¸ö¶ÀÌØµÄ·½°¸¾ÍÊÇOleryµÄÊý¾Ý¿âµÄ¾ø´ó¶àÊýд²Ù×÷¶¼ÊÇÏ൱¶¨ÆÚµÄ£¬¾³£±ä»¯µÄÊý¾Ý(ÀýÈçÓû§Í¨Ñ¶Â¼ÐÅÏ¢)Ö»Õ¼×ÜÊý¾ÝÁ¿µÄһС²¿·Ö£¬Ïà±ÈÆðOlery¼ì²éÊý¾Ý£¬Ç¨ÒÆËüÃÇ»¨·ÑµÄʱ¼äÏ൱µÄС¡£
Õⲿ·ÖµÄ»ù±¾Á÷³ÌÊÇ£º
1.Ç¨ÒÆ¹Ø¼üÊý¾Ý£¬ÀýÈçÓû§¡¢ºÏͬºÍÄÇЩÎÞÂÛÈçºÎ¶¼ÎÞ·¨³Ðµ£ËðʧµÄÊý¾Ý¡£
2.Ç¨ÒÆ²»ÄÇô¹Ø¼üµÄÊý¾Ý(ÎÒÃÇ¿ÉÒÔÖØÐÂÊÕ¼¯£¬ÖØÐ¼ÆËãµÈµÄÊý¾Ý)
3.²âÊÔÊÇ·ñËùÓÐÊÂÇé¶¼ÒÑÍê³É£¬²¢ÔËÐÐÔÚÒ»×é·ÖÀëµÄ·þÎñÆ÷ÉÏ¡£
4.½«Éú²ú»·¾³×ª»»µ½ÐµķþÎñÆ÷ÉÏ¡£
5.ÖØÐÂÇ¨ÒÆµÚÒ»²½µÄÊý¾Ý£¬È·±£ÔÚÇ¨ÒÆ¹ý³ÌÖвúÉúµÄÊý¾ÝûÓжªÊ§¡£
µ½Ä¿Ç°ÎªÖ¹£¬µÚ¶þ²½»¨·ÑµÄʱ¼ä×£¬´óԼΪ24Сʱ¡£ÁíÒ»·½Ãæ£¬Ç¨ÒÆ²½Öè1ºÍ5ÖÐÌáµ½µÄÊý¾ÝÖ»»¨ÁË45·ÖÖÓ¡£
½áÂÛ
OleryÇ¨ÒÆÍê³É²¢ÇÒÖ±µ½·Ç³£ÂúÒâ´ó¸Å¹ýÈ¥ÁËÒ»¸öÔ¡£µ½ÏÖÔÚΪֹ³ýÁËÄÇЩ»ý¼«µÄÓ°Ï죬»¹ÔøÔÚ¸÷ÖÖÇé¿öÖÐÈÃÓ¦ÓõÄÐÔÄÜ´ó·ùÌá¸ß¡£¾ÙÀýÀ´Ëµ£¬OleryµÄ
¾ÆµêÆÀÂÛÊý¾ÝAPI(Hotel Review Data API)(ÔÚSinatraÔËÐÐ)Ïà±ÈÇ¨ÒÆÖ®Ç°½»»¥ÑÓ³Ù±äµÍÁËÐí¶à£º

Ç¨ÒÆÊÇÔÚ1ÔÂ21ÈÕ¿ªÊ¼µÄ£¬¸ß·å±íʾӦÓÃÐÔÄܵÄÓ²ÖØÆô(ÔÚ´¦ÀíÆÚ¼äµ¼Ö½»»¥Ê±¼äÇá΢±äÂý)¡£ÔÚ21ÈÕÖ®ºó½»»¥µÄƽ¾ùʱ¼ä´óÖÂÊÇÔÀ´µÄÒ»°ë¡£
ÔÚÁíÍâÒ»ÖÖ±»Olery³Æ×÷¡°ÆÀÂ۳־û¯¡±(ÒëÕß×¢£º¼´´æ´¢ÆÀÂÛ)µÄ¹ý³ÌÖУ¬Olery·¢ÏÖÁËÐÔÄÜÉϾ޴óµÄÌáÉý¡£ºǫ́³ÌÐòÄ¿±êºÜ¼òµ¥£º±£´æÆÀÂÛÊý¾Ý(ÆÀÂÛÄÚÈÝ£¬ÆÀÂÛ·ÖÊýµÈµÈ)¡£µ±×îÖÕÍê³ÉÁËÎªÇ¨ÒÆ¹¤×÷×öµÄºÜ¶à´óµÄ¸ü¸Äºó£¬½á¹ûÁîÈËÕñ·Ü£º

ץȡÆ÷Ò²±äµÄ¸ü¿ìÁË£º

ץȡÆ÷ÐÔÄÜÌáÉýûÓÐÆÀÂÛ´æ´¢µÄ¹ý³ÌÄÇÑù´ó£¬ÒòΪץȡÆ÷Ö»ÓÃÊý¾Ý¿âÀ´²éѯij¸öÆÀÂÛÊÇ·ñ´æÔÚ(Ò»¸öÏà¶ÔºÜ¿ìµÄ²Ù×÷)£¬ËùÒÔÕâÑùµÄ½á¹û²¢²»ºÜÁîÈ˳Ծª¡£
×îºóÀ´µ½³ÌÐòÀïÓÃÀ´µ÷¶Èץȡ¹ý³ÌµÄ½ø³Ì(¼òµ¥³ÆÖ®Îª¡°µ÷¶ÈÆ÷¡±)£º

ÒòΪµ÷¶ÈÆ÷Ö»ÊÇÒԹ̶¨Æµ¶ÈÔËÐУ¬Õâ¸öͼ¿ÉÄÜÓеãÄÑÒÔÀí½â£¬µ«ÊDz»¹ÜÔõÑù£¬ÔÚÇ¨ÒÆÖ®ºóÓÐÒ»¸öºÜÇåÎúµÄƽ¾ù´¦Àíʱ¼äµÄϽµ¡£
|