{"id":278,"date":"2010-08-25T22:02:22","date_gmt":"2010-08-25T14:02:22","guid":{"rendered":"http:\/\/csslayer.tk\/wordpress\/?p=278"},"modified":"2010-08-26T00:39:55","modified_gmt":"2010-08-25T16:39:55","slug":"bad-trans-on-mysql-in-amarok2-the-reality","status":"publish","type":"post","link":"https:\/\/www.csslayer.info\/wordpress\/kde\/bad-trans-on-mysql-in-amarok2-the-reality\/","title":{"rendered":"Amarok2\u4e2d\u7684MySQL-\u771f\u76f8\uff08\u6e23\u7ffb\u8bd1\uff09"},"content":{"rendered":"<p>\u539f\u6587\u94fe\u63a5\uff1a<a href=\"http:\/\/amarok.kde.org\/blog\/archives\/812-MySQL-in-Amarok-2-The-Reality.html\">http:\/\/amarok.kde.org\/blog\/archives\/812-MySQL-in-Amarok-2-The-Reality.html<\/a><\/p>\n<p>08\u5e74\u7684\u8001\u6587\uff0c\u770b\u6709\u4eba\u804a\u5230KDE\u91cc\u9762\u7684MySQL\u7528\u7684\u5f88\u591a\u65f6\u641c\u7d22\u4e86\u4e00\u4e0b\uff0c\u7ed3\u679c\u53d1\u73b0\u4e86\u8fd9\u7bc7\u6587\u7ae0\u3002\u8bfb\u5b8c\u4e4b\u540e\uff0c\u7a81\u7136\u60f3\u7ffb\u8bd1\u4e00\u4e0b\u4e86\u3002\u770b\u5230\u6700\u540e\u611f\u89c9\u611f\u89e6\u9887\u6df1\u554a\uff0c\u771f\u7684\uff0c\u5f00\u53d1\u8fc7\u4e00\u4e9b\u5c0f\u73a9\u610f\uff0c\u9762\u5bf9\u7740\u6216\u591a\u6216\u5c11\u7684\u771f\u6b63\u7528\u6237\uff0c\u5fc3\u6709\u621a\u621a\u7109\uff0c\u867d\u7136\u8fd9\u4e48\u8bb2\u4e5f\u8bb8\u6709\u70b9\u5984\u81ea\u5c0a\u5927\uff0c\u53ef\u662f\u8fd8\u662f\u5fcd\u4e0d\u4f4f\uff0c\u60f3\u8981\u505a\u51fa\u66f4\u597d\u7684\u4e1c\u897f\u7ed9\u5927\u5bb6\u2026\u2026\u7ffb\u8bd1\u5b8c\u4e86\u4e4b\u540e\u7565\u4fee\u6539\u4e86\u4e00\u4e0b\uff0c\u7ed3\u679c\u53d1\u73b0\u6709\u5f88\u591a\u770b\u8d77\u6765\u5f88\u56e7\u7684\u9519\u8bef\u2026\u2026\u6709\u4e0d\u5c11\u5730\u65b9\u662f\u610f\u8bd1\uff0c\u6b22\u8fce\u6307\u51fa\u9519\u8bef\u3002\u6bcf\u6bb5\u90fd\u9644\u4e0a\u539f\u6587\u5bf9\u7167\u3002<\/p>\n<p><!--more--><\/p>\n<p>\u6700\u8fd1\u5173\u4e8eAmarok\u5c06MySQL\u4f5c\u4e3a\u552f\u4e00SQL\u540e\u7aef\u8fd9\u4ef6\u4e8b\u4e0a\u6709\u8bb8\u591a\u8ba8\u8bba\u3002\u76f8\u5f53\u7684\u4e00\u90e8\u5206\u662f\u5bf9\u4e8e\u4e0d\u786e\u5b9a\u7684\u6050\u60e7\u2014\u2014\u6709\u4e9b\u4ec5\u4ec5\u662f\u4eba\u4eec\u5bf9\u4e8e\u6539\u53d8\u7684\u6297\u62d2\uff0c\u6709\u4e9b\u4ec5\u4ec5\u662f\u4e0d\u7406\u89e3\u8fd9\u4e2a\u51b3\u5b9a\u3002\u6709\u4e9b\u8ba8\u8bba\uff08\u7279\u522b\u662fAdriaan\u7684\u535a\u6587\uff09\u5f88\u6709\u610f\u601d\uff0c\u5e76\u4e14\u6709\u7740\u6df1\u523b\u89c1\u89e3\uff0c\u4f46\u662f\u5374\u5ffd\u7565\u4e86\u4e3a\u4ec0\u4e48\u505a\u51fa\u4e86\u8fd9\u4e9b\u6539\u53d8\u3002\u672c\u6587\u5c1d\u8bd5\u53bb\u89e3\u91ca\u4e3a\u4ec0\u4e48\u505a\u51fa\u4e86\u8fd9\u4e2a\u51b3\u5b9a\uff0c\u8fd9\u4e2a\u51b3\u5b9a\u5bf9\u4e8e\u4e00\u4e2a\u6700\u7ec8\u7528\u6237\u610f\u5473\u7740\u4ec0\u4e48\uff0c\u4e3a\u4ec0\u4e48\u4f60\u5e94\u8be5\u559d\u53e3\u8336\u6b47\u4e00\u6b47\u3002<\/p>\n<p>There has been <a href=\"http:\/\/dot.kde.org\/1223401559\/\" target=\"_blank\">a lot<\/a> of <a href=\"http:\/\/people.fruitsalad.org\/adridg\/bobulate\/index.php?\/archives\/657-MySQL-in-KDE.html\" target=\"_blank\">chatter<\/a> lately regarding Amarok&#8217;s switch to MySQL as its only SQL backend.  A  decent amount is FUD &#8212; either by people simply pushing back against  change, or by people that simply don&#8217;t understand the decision.  Some of  it (particularly Adriaan&#8217;s blog post) has been insightful and  interesting, but miss the mark in terms of why this change was made.  This post attempts to explain why this decision was made, what it really  means for you the end-user, and why you should have a cup of tea and  relax.<\/p>\n<p>\u6211\u60f3\u9996\u5148\u6307\u51fa\u7684\u662f\uff0c\u6211\u8bf4\u8fc7MySQL\u5c06\u4f1a\u6210\u4e3aAmarok\u7684\u552f\u4e00<em>SQL\u540e\u7aef<\/em>\u3002Amarok2\u7684\u6536\u85cf\u7cfb\u7edf\u5f88\u5f3a\u5927\u3002\u770b\u770b\u6709\u591a\u5c11\u5404\u79cd\u5404\u6837\u7684\u97f3\u4e50\u6e90\u5427\uff0c\u6765\u81eaShoutcast\u7684\uff0cJamendo\u7684\uff0cMagnatune\u7684\uff0cAmpache\u7684\uff0cMP3Tunes\u7684\uff0c\u8fd8\u6709\u6765\u81ea\u672c\u5730\u7684\uff0c\u6bd4\u5982\u6765\u81eaiPod\u548c\u672c\u5730\u7684\u6587\u4ef6\u7cfb\u7edf\uff0c\u5b83\u4eec\u5728Amarok2\u5f53\u4e2d\u90fd\u88ab\u540c\u7b49\u5bf9\u5f85\u4e86\u3002Amarok1\u7684\u6536\u85cf\u4ec5\u4ec5\u662f\u4e2a\u6536\u85cf\uff0c\u5e76\u4e14\u88ab\u5b83\u81ea\u5df1\u6240\u58f0\u660e\u7684\u529f\u80fd\u9650\u5236\u4e86\uff08\u5f53\u7136\uff0c\u4ed6\u80fd\u63d0\u4f9b\u5b83\u81ea\u5df1\u7684\u7279\u5b9a\u529f\u80fd\uff09\u3002\u867d\u7136\u6211\u4e0d\u8fd9\u4e48\u60f3\uff0c\u4f46\u662f\u540c\u65f6\u8fd8\u6709\u4e00\u4e2a\u57fa\u4e8eNepomuk\u7684\u6536\u85cf\u9009\u9879\u6ca1\u6709\u88ab\u542f\u7528\u3002\uff08\u6ce8\uff1a\u8fd9\u4e2ai don&#8217;t think\u770b\u7684\u6211\u4e00\u5934\u96fe\u6c34\uff09\u6240\u4ee5\u632f\u4f5c\u4e00\u70b9\uff0c\u8fd9\u4e2a\u53d8\u5316\u53ea\u662f\u5f71\u54cdAmarok\u7684\u5185\u90e8SQL\u6536\u85cf\uff0c\u4f46\u4e0d\u5305\u62ec\u5176\u4ed6\u6765\u6e90\uff08\u5c3d\u7ba1\u5982\u679c\u90a3\u4e9b\u6765\u6e90\u4e50\u610f\uff0c\u4ed6\u4eec\u4e5f\u53ef\u4ee5\u628a\u4fe1\u606f\u5b58\u50a8\u5728SQL\u6570\u636e\u5e93\u4e2d\uff09\u3002<\/p>\n<p>I want to point out first that I said that MySQL is going to be Amarok&#8217;s only <em>SQL backend<\/em>.   A2&#8217;s collection system is very powerful.  Just take a look at how  varied music sources from Shoutcast, Jamendo, Magnatune, Ampache,  MP3Tunes, as well as local sources like iPods and your local file  system, are treated as equals in A2.  A collection is a collection, and  is limited only by what capabilities it advertises it can support (and  of course, it can supply its own custom capabilities).  It&#8217;s not  currently enabled, I don&#8217;t think, but there&#8217;s a Nepomuk-based collection  option too.  So take heart &#8212; this change only affects Amarok&#8217;s  internal SQL collection, and not other sources (although those sources  can store information in the SQL database if they wish to cache  information).<\/p>\n<p>\u7531\u4e8e\u6211\u63d0\u5230\u4e86Nepomuk\uff0c\u6211\u4eec\u4e5f\u6765\u8c08\u8c08\u53e6\u4e00\u4e2a\u666e\u904d\u7684\u95ee\u9898\/\u9700\u6c42\/\u62b1\u6028\uff1a<em>KDE\u5df2\u7ecf\u6709\u4e86\u5f88\u597d\u7684Strigi-Nepomuk\u5728\u5de5\u4f5c\uff0c\u4e3a\u4ec0\u4e48\u6211\u4eec\u4e0d\u7528\u5b83\u6765\u641c\u7d22\u97f3\u4e50\u5e76\u4e14\u5b58\u50a8\u4fe1\u606f\uff1f<\/em>\u8fd9\u6709\u5f88\u591a\u539f\u56e0\u3002\u7b2c\u4e00\u4e2a\u539f\u56e0\u662fStrigi\u548cNepomuk\u662f\u53ef\u9009\u7684\uff0c\u5e76\u975e\u5fc5\u8981\u7684\u3002\uff08\u66f4\u65b0\uff1aStrigi\u662f\u5fc5\u8981\u7684\uff0c\u4f46Soprano\u4e0d\u662f\uff0c\u6240\u4ee5Nepomuk\u4ece\u6574\u4f53\u4e0a\u6765\u8bf4\u8fd8\u662f\u53ef\u9009\u7684\u3002\uff09\u6211\u4eec\u4e0d\u80fd\u6307\u671b\u7528\u6237\u5b89\u88c5\u4e86\u8fd9\u4e9b\uff0c\u800c\u4e14\u5c31\u7b97\u4ed6\u4eec\u5b89\u88c5\u4e86\uff0c\u6211\u4eec\u4e0d\u80fd\u6307\u671b\u7528\u6237\u6b63\u786e\u5730\u914d\u7f6e\u4e86\u4ed6\u4eec\uff08\u6ce8\u610f\u7531\u4e8e\u6211\u4eec\u7684\u8ba1\u5212\u662f\u8de8\u5e73\u53f0\uff0c\u8fd9\u4f7f\u5f97\u8fd9\u4ef6\u4e8b\u66f4\u4e0d\u5927\u53ef\u80fd\u4e86\uff09\u3002\u7b2c\u4e8c\u4e2a\u539f\u56e0\u662f\u901f\u5ea6\uff1aAmarok\u7684\u81ea\u5b9a\u4e49\u6536\u85cf\u626b\u63cf\u7684\u901f\u5ea6\u975e\u5e38\u5feb\uff0c\u5e76\u4e14\u5229\u7528taglib\u6536\u96c6\u7279\u5b9a\u7684\u4fe1\u606f\u3002\u548cStrigi\u6bd4\u8f83\u8d77\u6765\uff0cStrigi\u7684\u901f\u5ea6\u5c31\u592a\u6162\u4e86\uff08\u5b83\u9700\u8981\u8ba1\u7b97\u6240\u6709\u6587\u4ef6\u7684\u54c8\u5e0c\u503c\uff0c\u8fd9\u610f\u5473\u7740\u5b83\u5c06\u4f1a\u8bfb\u53d6\u6574\u4e2a\u6587\u4ef6\uff09\uff0c\u5e76\u4e14\u53d6\u5f97\u8f83\u5c11\u7684\u4fe1\u606f\u3002\uff08\u66f4\u65b0\uff1a\u7167Strigi\u5f00\u53d1\u8005\u7684\u8bf4\u6cd5\uff0c\u800c\u4e0d\u662f\u5728<a href=\"http:\/\/www.kde-apps.org\/content\/show.php?content=40889\">kde-apps.org<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Strigi\">\u7ef4\u57fa\u767e\u79d1<\/a>\uff0c\u751a\u81f3\u5728\u4f5c\u8005<a href=\"http:\/\/strigi.sourceforge.net\/?q=features\">\u81ea\u5df1\u4e3b\u9875<\/a>\u4e0a\u7684\u63cf\u8ff0\uff0cStrigi\u9ed8\u8ba4\u5e76\u4e0d\u8ba1\u7b97\u6587\u4ef6\u7684\u54c8\u5e0c\u503c\u3002\u8fd9\u4f7f\u5f97\u5bf9\u4e8eStrigi\u6765\u8bf4\uff0c\u5982\u679c\u914d\u7f6e\u5f97\u5f53\u7684\u8bdd\uff0c\u548cAmarok\u7684\u5185\u7f6e\u626b\u63cf\u76f8\u6bd4\u80fd\u591f\u4e00\u6837\u5feb\u3002\u5c3d\u7ba1\u6211\u4e0d\u77e5\u9053\u5b83\u662f\u5426\u5c06\u6240\u6709\u9700\u8981\u7684\u4fe1\u606f\u90fd\u63d0\u53d6\u51fa\u6765\u3002\u4f46\u5982\u679c\u5b83\u914d\u7f6e\u6210\u9700\u8981\u8ba1\u7b97\u6240\u6709\u6587\u4ef6\u7684SHA1\u54c8\u5e0c\u503c\uff0c\u90a3\u4e48\u5b83\u80af\u5b9a\u4f1a\u975e\u5e38\u6162\u3002\uff09\u5728\u672c\u5730\u786c\u76d8\u4e0a\uff0c\u8fd9\u5e76\u4e0d\u662f\u4e00\u4e2a\u5927\u95ee\u9898\uff0c\u4f46\u662f\u5f53\u4f60\u5c06\u57fa\u4e8e\u7f51\u7edc\u7684\u5b58\u50a8\u7eb3\u5165\u8003\u8651\u8303\u56f4\u5185\u7684\u65f6\u5019\uff0c\u8fd9\u5c31\u662f\u4e2a\u5927\u95ee\u9898\u4e86\uff0c\u800c\u4e14\u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u666e\u901a\u7684\u573a\u666f\u3002\u540c\u65f6\u5c3d\u7ba1\u6211\u4e0d\u8bb0\u5f97\u7ec6\u8282\u4e86\uff0c\u4f46\u6211\u4e5f\u542c\u8bf4\uff0c\u548c\u4e00\u822c\u7684SQL\u6570\u636e\u5e93\u76f8\u6bd4\uff0c\u5bf9Nepomuk\u7684\u67e5\u8be2\u662f\u5f88\u6162\u7684\u3002\u540c\u65f6\u8bb0\u5f97\u5f53\u57fa\u4e8eNepomuk\u7684\u6536\u85cf\u5b8c\u6210\u7684\u65f6\u5019\uff0c\u6765\u6e90\u4e8e\u57fa\u4e8eNepomuk\u7684\u6536\u85cf\u5c06\u4f1a\u628a\u5b83\u4eec\u7684\u5143\u6570\u636e\u4fee\u6539\u5b58\u56deNepomuk\u5f53\u4e2d\u3002\u6240\u4ee5SQL\u6536\u85cf\u5e76\u4e0d\u662fNepomuk\u7684\u66ff\u4ee3\u2014\u2014\u5b83\u4eec\u662f\u5b8c\u5168\u72ec\u7acb\u7684\u3002\uff08\u66f4\u65b0\uff1a\u6211\u5fd8\u8bb0\u63d0\u5230\u57fa\u4e8eNepomuk\u7684\u6536\u85cf\u5df2\u7ecf\u5b58\u5728\u4e86\u3002\u5b83\u5df2\u7ecf\u7531GSoCer\u5728\u6691\u5047\u5f00\u53d1\u5b8c\u6210\u3002\u6211\u4e0d\u786e\u5b9a\u5b83\u7684\u72b6\u6001\u662f\u5426\u53ef\u4ee5\u8d76\u4e0a2.0\u7684\u53d1\u5e03\uff0c\u4f46\u662f\u6211\u4eec\u8fd9\u4e9bAmaroker\u90fd\u5f88\u559c\u6b22Strigi\/Nepomuk\uff0c\u5e76\u4e14\u5bf9\u4e8e\u6253\u5f00\u5e94\u7528\u7a0b\u5e8f\u4e4b\u540e\u6240\u6709\u97f3\u4e50\u90fd\u6b63\u786e\u53ef\u7528\uff0c\u5e76\u4e14\u4e0d\u9700\u8981\u4efb\u4f55\u9884\u5148\u914d\u7f6e\u8fd9\u4e2a\u70b9\u5b50\u611f\u5230\u5174\u594b\u3002\u4f46\u662fSQL\u6536\u85cf\u4e5f\u786e\u5b9e\u5360\u6709\u4e00\u5e2d\u4e4b\u5730\u3002\u6b63\u5982\u6211\u8bf4\u7684\uff1a\u5b83\u4eec\u90fd\u662f\u5f88\u597d\u7684\u6280\u672f\u3002\uff09<\/p>\n<p>Since I mentioned Nepomuk, it&#8217;s time to discuss another common question\/demand\/complaint: <em>KDE has this nice Strigi-Nepomuk thing going on&#8230;why aren&#8217;t we using it for scanning music and storing information?<\/em> There are a couple main reasons.  The first is that Strigi and Nepomuk  are optional, not required.  (Update: Strigi is required, but Soprano  isn&#8217;t, so Nepomuk as a whole is still optional.)  We can&#8217;t rely on the  user installing them, and even if they are installed, we can&#8217;t rely on  the user to configure them properly (remember that we&#8217;re going  cross-platform, making it even less likely).  The second reason is  speed: Amarok&#8217;s custom collection scanner is extremely fast and pulls  out specific pieces of information with TagLib.  Strigi is, by  comparison, very slow (it calculates hashes of all files, which means it  needs to read the entire file) and pulls out less information. (Update:  According to the Strigi developer, and despite what is said on <a href=\"http:\/\/www.kde-apps.org\/content\/show.php?content=40889\" target=\"_blank\">kde-apps.org<\/a>, <a href=\"http:\/\/en.wikipedia.org\/wiki\/Strigi\" target=\"_blank\">Wikipedia<\/a>, and even the author&#8217;s <a href=\"http:\/\/strigi.sourceforge.net\/?q=features\" target=\"_blank\">own home page<\/a>,  it does not calculate hashes by default. So it&#8217;s possible that Strigi,  if properly configured, could be as fast as Amarok&#8217;s internal scanner,  although whether it would pull out all necessary information, I don&#8217;t  know.  If it&#8217;s configured to calculate SHA1 hashes of all files, then it  will indeed be far slower.)  On a local hard drive, it may not be a big  issue, but it sure is a huge issue when you throw networked storage  into the picture, which is a very common scenario.  I&#8217;ve also heard,  though don&#8217;t remember specifics, that querying and such through Nepomuk  is rather slow, compared to a normal SQL database.\u00a0 Regardless, though,  remember that when the Nepomuk-based collection is finished, tracks  sourced through a Nepomuk-based collection will have their metadata  changes saved back to Nepomuk.  So, it&#8217;s not that the SQL collection is  in place of Nepomuk &#8212; they are entirely independent. (Update: I forgot  to mention that a Nepomuk collection already exists.  It was developed  by a GSoCer over the summer.  I&#8217;m not sure what its status is as far as  making the 2.0 release, but we Amarokers both like Strigi\/Nepomuk and  are excited about the idea of opening up the app and having all your  music available right then and there with no pre-configuration.  But  there is a place for the SQL collection too.  As I said: they are  complimentary technologies.)<\/p>\n<p>\u6211\u4eec\u5df2\u7ecf\u8dd1\u9898\u4e86\uff0c\u73b0\u5728\u56de\u5230\u6b63\u9898\u4e0a\u3002<\/p>\n<p>With those topics out of the way, on to the meat.<\/p>\n<p>\u9996\u5148\uff0c\u7406\u89e3\u4e24\u4e2a\u5173\u952e\u7684\u4e8b\u5b9e\u662f\u5f88\u91cd\u8981\u7684\u3002\u7b2c\u4e00\uff0c\u6211\u4eec\u4e0d\u662f\u641e\u6570\u636e\u5e93\u7684\u3002\u662f\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u628a\u6570\u636e\u5b58\u8fdb\u6570\u636e\u5e93\uff0c\u5e76\u4e14\u6216\u591a\u6216\u5c11\u7684\u63d0\u4f9b\u4e00\u4e2a\u5de5\u4f5c\u7684\u6a21\u5f0f\uff08\u6ce8\uff1aSchema\uff0c\u56e0\u4e3a\u5e73\u65e5\u548c\u522b\u4eba\u8ba8\u8bba\u90fd\u7528\u8fd9\u4e2a\u8bcd\u7684\u82f1\u6587\uff08\u6ce8\u4e4b\u6ce8\uff1a<strong>\u6211\u662f\u641e\u6570\u636e\u5e93\u7684<\/strong>\uff09\u2026\u2026\u6211\u4e00\u76f4\u7ea0\u7ed3\u4e8e\u8981\u4e0d\u8981\u76f4\u63a5\u7528Schema\uff0c\u540e\u6765\u8fd8\u662f\u7528\u4e86\u6a21\u5f0f\u8fd9\u4e2a\u8bcd\uff09\uff0c\u4f46\u662f\u6211\u4eec\u5f53\u4e2d\u6ca1\u6709\u4e00\u4e2a\u662f\u4e13\u5bb6\/\u5929\u624d\/\u7edd\u5730\u6b66\u58eb\/\u7b49\u7b49\u3002\u8fd9\u5bfc\u81f4\u4e86\u7b2c\u4e8c\u4e2a\u4e8b\u5b9e\uff1a\u7ef4\u62a4\u4e09\u4e2a\u6570\u636e\u5e93\u5feb\u628a\u6211\u4eec<strong>\u6574\u75af\u4e86<\/strong>\u3002\u6bcf\u6b21\u4e00\u4e2a\u5f88\u5c0f\u7684\u6a21\u5f0f\u53d8\u52a8\u90fd\u9700\u8981\u5bf9\u4e09\u7c7b\u6570\u636e\u5e93\u8fdb\u884c\u7f16\u7801\u3002\u5bf9\u4e8e\u6a21\u5f0f\u7684\u4fee\u6539\u5bf9\u4e8e\u4e00\u4e2a\u6570\u636e\u5e93\u53ef\u80fd\u5c31\u662f\u4e9b\u7410\u788e\u7684\u5c0f\u4e8b\uff0c\u5bf9\u4e8e\u53e6\u4e00\u4e2a\u5c31\u53ef\u80fd\u975e\u5e38\u56f0\u96be\uff08\u751a\u81f3\u4e0d\u53ef\u80fd\uff09\u3002\u4eba\u4eec\u4f1a\u56de\u62a5\u90a3\u4e9b\u6211\u4eec\u65e0\u6cd5\u91cd\u590d\u7684Bug\uff0c\u6700\u540e\u4ec5\u4ec5\u53d1\u73b0\u56e0\u4e3a\u6211\u4eec\u4e0d\u80fd\u7406\u89e3\u8fd9\u4e9b\u6570\u636e\u5e93\u662f\u5982\u4f55\u5177\u4f53\u5de5\u4f5c\u7684\uff08\u6216\u8005\u5728\u53e6\u4e00\u4e9b\u60c5\u51b5\u4e2d\uff0c\u6ca1\u6709\u4efb\u4f55\u4e00\u4e2a\u6d3b\u8dc3\u7684\u5f00\u53d1\u8005\u4f7f\u7528\u90a3\u4e2a\u7c7b\u578b\u7684\u6570\u636e\u5e93\uff09\u3002\u8fd8\u6709\u8bb8\u591a\u7c7b\u4f3c\u7684\u4e8b\u60c5\u3002\u6240\u4ee5\u5728Amarok2\u5f00\u53d1\u4e4b\u521d\uff08\u5728Amarok1\u5f00\u53d1\u65f6\u7684\u5e7b\u60f3\u4e2d\uff09\uff0c\u6211\u4eec\u5c31\u77e5\u9053\u6211\u4eec\u53ea\u60f3\u8981\u4e00\u4e2a\u6570\u636e\u5e93\u3002<\/p>\n<p>First,  it is important to understand an important pair of facts.  Number one:  we are not database guys.  Sure, we can store data in them, and more or  less come up with a working schema, but none of us are  gurus\/wizards\/jedis\/etc.  This leads in to number two: maintaining three  databases was driving us <em><strong>crazy<\/strong><\/em>. Every time a minor schema  change was needed, it had to be coded up for all three types of  databases.  Modifying a schema could be trivial for one database type,  and super difficult (or impossible) for another.  People would report  bugs that we couldn&#8217;t reproduce, only to find out that it was because we  didn&#8217;t quite understand how one database or another behaved (or in some  cases, none of the active devs were using that type).  And so on.  So  from the beginning of A2 development (and in our fantasies during A1  development) we knew we wanted just one database.<\/p>\n<p>\uff08\u6211\u4eec\u786e\u5b9e\u770b\u4e86\u90a3\u4e9b\u62bd\u8c61\u5c42\uff0c\u4f8b\u5982QtSQL\u7b49\u7b49\u3002\u6211\u4e0d\u60f3\u8fc7\u591a\u7684\u8bc4\u8bba\u4ed6\u4eec\uff0c\u56e0\u4e3a\u6211\u5e76\u6ca1\u6709\u5bf9\u4ed6\u4eec\u8fdb\u884c\u8bc4\u4f30\uff0c\u4f46\u662f\u603b\u7684\u8bf4\u6765\u5982\u679c\u4e0d\u8fdb\u884c\u4e00\u4e9b\u7279\u5b9a\u7684SQL\u7f16\u7a0b\uff0c\u4ed6\u4eec\u5e76\u4e0d\u7075\u6d3b\u5230\u8db3\u4ee5\u5e94\u4ed8\u6211\u4eec\u6240\u6709\u9700\u6c42\uff08\u7279\u522b\u662f\u5728\u4e00\u4e9b\u4fee\u6539\u6a21\u5f0f\u7684\u4efb\u52a1\u4e0a\uff09\uff0c\u8fd9\u5bfc\u81f4\u6211\u4eec\u6ca1\u6709\u91c7\u7528\u4ed6\u4eec\u3002\u5982\u679c\u4f60\u786e\u5b9e\u60f3\u77e5\u9053\u66f4\u591a\u4fe1\u606f\u6216\u8005\u575a\u6301\u8ba4\u4e3a\u4ed6\u4eec\u8db3\u591f\u5e94\u4ed8\u4efb\u52a1\uff0c\u95ee\u95eeeean\uff0c\u6211\u60f3\u4ed6\u5bf9\u4ed6\u4eec\u505a\u4e86\u8bc4\u4f30\u3002\uff09<\/p>\n<p>(We did  actually look at abstraction layers like QtSQL and others.  I&#8217;m not  going to comment on them much, as I didn&#8217;t do the evaluation, but in  general they were found to not be flexible enough to handle all of our  needs without doing some custom SQL coding (especially in the cases of  things like schema changes), which kind of defeats the point.  If you  want to know more\/want to insist that they are, try asking eean, as I  think he did the evaluations.)<\/p>\n<p>\u73b0\u5728\u6211\u4eec\u5fc5\u987b\u9009\u62e9\u4e00\u4e2a\u6570\u636e\u5e93\u3002\u7b2c\u4e00\u773c\u770b\u6765\uff0cSQLite\u662f\u4e2a\u4e0d\u9519\u7684\u9009\u62e9\u3002\u4f7f\u7528\u4e8b\u52a1\u7684\u8bdd\uff0c\u4ed6\u7684\u901f\u5ea6\u5f88\u5feb\u3002\u5341\u5206\u7a33\u5b9a\uff08\u90a3\u4e9b\u62b1\u6028\u5947\u602a\u7684MySQL\u7684bug\u7684\u4eba\u5e94\u8be5\u548cmarkey\u8c08\u8c08\uff0c\u4ed6\u662f1.4\u7684SQLite\u540e\u7aef\u7ef4\u62a4\u8005\uff0c\u53ef\u4ee5\u8bc1\u5b9eSQLite\u6709\u4ed6\u7684\u4e00\u5e2d\u4e4b\u5730\uff09\u3002\u4f46\u662f\u8fd8\u662f\u6709\u4e00\u4e9b\u95ee\u9898\u628a\u5b83\u8e22\u51fa\u5c40\u4e86\u3002\u7b2c\u4e00\u4e2a\u95ee\u9898\u662f\u6027\u80fd\u3002\u5c3d\u7ba1\u5bf9\u53ea\u6709\u4e00\u4e2a\u5c0f\u6536\u85cf\u7684\u4eba\u6765\u8bf4\u5b83\u5de5\u4f5c\u7684\u5f88\u597d\uff0c\u6709\u7740\u5927\u91cf\u6536\u85cf\u7684\u7684\u4eba\u5728\u6362\u5230MySQL\u6216\u8005PostgreSQL\u4e4b\u540e\u6c47\u62a5\u4e86\u4ed6\u4eec\u5728\u8fdb\u884c\u590d\u6742\u6216\u8005\u5f88\u591a\u67e5\u8be2\u7684\u65f6\u5019\u83b7\u5f97\u4e86\u5f88\u5927\u7684\u901f\u5ea6\u63d0\u5347\uff0c\u4f8b\u5982\u628a\u5f88\u591a\u9879\u76ee\u52a0\u5165\u64ad\u653e\u5217\u8868\u7684\u65f6\u5019\uff0c\u626b\u63cf\u6587\u4ef6\u7684\u65f6\u5019\uff0c\u4ee5\u53ca\u5bf9\u6536\u85cf\u8fdb\u884c\u641c\u7d22\/\u8fc7\u6ee4\u7684\u65f6\u5019\u3002\u7531\u4e8e\u6211\u4eec\u60f3\u8981\u8c03\u548c\u90a3\u4e9b\u6709\u7740\u5927\u6536\u85cf\u548c\u5c0f\u6536\u85cf\u7684\u4eba\u7684\u9700\u6c42\uff0c\u5e76\u4e14\u6570\u5b57\u97f3\u4e50\u6536\u85cf\u7684\u89c4\u6a21\u5e76<a href=\"http:\/\/www.eff.org\/wp\/riaa-v-people-years-later\">\u6ca1\u6709\u7f29\u5c0f\u7684\u8d8b\u52bf<\/a>\uff0c\u6709\u7740\u5927\u6536\u85cf\u7684\u4eba\u7684\u6570\u91cf\u589e\u957f\u901f\u5ea6\u662f\u5f88\u91cd\u8981\u7684\u3002\u8bb8\u591a\u6211\u4eec\u7684\u5f00\u53d1\u8005\uff0c\u5728\u5207\u6362\u5230mysqle\uff08\u6211\u4eec\u8fd9\u4e48\u53eb\u5b83\uff0c\u5c3d\u7ba1\u8fd9\u4e0d\u662f\u5b98\u65b9\u540d\u79f0\uff09\u4e4b\u540e\uff0c\u5728\u6bcf\u65e5\u7684Amarok2\u4f7f\u7528\u4e2d\uff0c\u6ce8\u610f\u5230\u4e86\u5de8\u5927\u7684\u901f\u5ea6\u63d0\u5347\uff0c\u56e0\u6b64\u5d4c\u5165\u5f0f\u670d\u52a1\u5668\u548c\u4e00\u822c\u7684\u670d\u52a1\u5668\u76f8\u6bd4\u4e5f\u80fd\u5e26\u6765\u901f\u5ea6\u63d0\u5347\u3002\u8fd9\u662f\u5bf9SQLite\u7684\u7b2c\u4e00\u62f3\u3002<\/p>\n<p>Now we had to choose  the type.  At first, SQLite seemed like a good choice.  Using  transactions, it&#8217;s decently fast.  It&#8217;s pretty stable (those that  complain about odd MySQL bugs should talk to markey, as he, being the  SQLite maintainer in 1.4, can attest that SQLite&#8217;s had its fair share).   However, there were a few problems that in the end knocked it out of  the running.  The first problem is performance.  Although for people  with small collections it performs fairly well, people with large  collections that switched to the MySQL or PostgreSQL backends in A1  would report enormous speed gains when operations performing complex or  many queries were performed, such as adding many entries to the  playlist, scanning files, or filtering\/searching in the collection.   Since we want to accommodate users with large collections just as well  as those with smaller collections, and since digital music collections <a href=\"http:\/\/www.eff.org\/wp\/riaa-v-people-years-later\" target=\"_blank\">aren&#8217;t getting smaller<\/a>,  the speed increase for our users with large collections was quite  important.  Many of our developers, after the switch to mysqle (as we  call it, though that&#8217;s not the official name), have noticed huge speed  increases in their day-to-day use of A2, so that speed increase is  carrying through to the embedded server as well as the normal server.  That was the first knock against SQLite.<\/p>\n<p>\u53e6\u4e00\u4e2a\u4f7f\u6211\u4eec\u4e0d\u91c7\u7528SQLite\u7684\u539f\u56e0\u662f\u5b8c\u5168\u4e0d\u540c\u7684\u3002\u8bb8\u591a\u7528\u6237\uff08\u5305\u62ec\u6211\u81ea\u5df1\u5728\u5185\uff09\u6709\u8bb8\u591a\u7535\u8111\uff0c\u4f46\u662f\u5374\u53ea\u6709\u4e00\u4e2aAmarok\u6570\u636e\u5e93\u3002\u5047\u5b9a\u6240\u6709\u7535\u8111\u90fd\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e2a\u6302\u8f7d\u5730\u70b9\u8bbf\u95ee\u97f3\u4e50\uff08\u5176\u4ed6\u4e1c\u897f\u4e5f\u914d\u7f6e\u6b63\u786e\uff09\uff0c\u8fd9\u4f7f\u5f97\u4f60\u53ef\u4ee5\u53ea\u626b\u63cf\u4e00\u6b21\uff0c\u4f46\u80fd\u5728\u5176\u4ed6\u6240\u6709\u5730\u65b9\u64ad\u653e\uff0c\u65e0\u8bba\u5728\u90a3\u91cc\u64ad\u653e\u97f3\u4e50\u90fd\u53ef\u4ee5\u5bf9\u540c\u4e00\u4e2a\u8bc4\u5206\u8fdb\u884c\u66f4\u65b0\uff0c\u8fd8\u6709\u5176\u4ed6\u5f88\u591a\u4e8b\u3002\u5c31\u7b97\u4f60\u5e76\u4e0d\u5728\u591a\u53f0\u7535\u8111\u95f4\u5171\u4eab\u6570\u636e\u5e93\uff0c\u8bb8\u591a\u7528\u6237\u7531\u4e8e\u901f\u5ea6\uff0c\u5b89\u5168\u6027\uff0c\u548c\u5907\u4efd\u7684\u539f\u56e0\uff0c\u4e5f\u60f3\u8981\u628a\u6570\u636e\u5e93\u5b58\u50a8\u5728\u4e00\u4e2a\u7279\u5b9a\u7684\u670d\u52a1\u5668\u4e0a\u3002\u5982\u679c\u4f60\u8ba4\u4e3a\u8fd9\u5e76\u4e0d\u662f\u4e00\u4e2a\u901a\u5e38\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u4f60\u5c31\u9519\u4e86\u3002MySQL\u548cPostgreSQL\u5bf9\u4e8e\u8fd9\u6837\u7684\u5de5\u4f5c\u91cf\u5de5\u4f5c\u7684\u5f88\u597d\u3002\u5bf9\u4e8eSQLite\u5c31\u884c\u4e0d\u901a\u4e86\uff0c\u56e0\u4e3a\u5b83\u662f\u4e3a\u4e86\u4e00\u4e2a\u4e0d\u540c\u7684\u76ee\u7684\u800c\u8bbe\u8ba1\u7684\u3002\u56e0\u6b64SQLite\u88ab\u4e24\u51fb\u76f4\u62f3\u91cd\u51fb\uff0cKO\u3002<\/p>\n<p>The other blow for  SQLite came for a totally different reason.  Many users (myself  included) have multiple computers sharing a single Amarok database.   Assuming all the computers have access to the music at the same mount  point (and a few other things are configured right), this allows you to  scan once, play everywhere, update the same ratings no matter where you  play it, and more.  Even if your aren&#8217;t sharing the database among  multiple computers, many users want their database stored on a  particular server for speed, security, or backup reasons.  If you think  either of these isn&#8217;t a common use-case, you&#8217;d be quite wrong.  MySQL  and PostrgreSQL were quite happy with this workload.  It&#8217;s a total no-go  for SQLite, simply because it&#8217;s designed for a different purpose.  So  SQLite had two big knocks against it. K.O.<\/p>\n<p>\u4f46\u662f\uff0c\u6b63\u5982\u6211\u4eec\u4e0d\u80fd\u6307\u671b\u7528\u6237\u6b63\u786e\u7684\u8bbe\u7f6e\u4e86Strigi\/Nepomuk\u90a3\u6837\uff0c\u6211\u4eec\u4e0d\u80fd\u6307\u671b\u4ed6\u4eec\u8bbe\u7f6e\u597d\u4e86MySQL\u548cPostgreSQL\u7684\u6570\u636e\u5e93\u7684\u8868\u3002\u56e0\u6b64\u6211\u4eec\u9700\u8981\u6570\u636e\u5e93\u80fd\u591f\u5d4c\u5165\u5f0f\u7684\u8fd0\u4f5c\uff0c\u8fd9\u6837\u5b83\u5c31\u80fd\u591f\u5728\u4e0d\u505a\u4efb\u4f55\u5176\u4ed6\u8bbe\u7f6e\u7684\u60c5\u51b5\u4e0b\u5de5\u4f5c\u4e86\u3002MySQL\uff0c\u548clibmysqld\uff0c\u57284.1\u7cfb\u5217\u5f53\u4e2d\u6709\u7740\u521d\u6b65\u7684\u652f\u6301\uff0c\u57285.0\u5f53\u4e2d\u5b83\u5c31\u5de5\u4f5c\u7684\u5f88\u597d\u4e86\uff0c\u5e76\u4e14\u57285.1\u4e2d\u5c31\u88ab\u5b8c\u5168\u652f\u6301\uff08\u636e\u6211\u6240\u77e5\uff09\u3002PostgreSQL\uff0c\u76f8\u6bd4\u8f83\u800c\u5df2\uff0c\u6ca1\u6709\u8fd9\u79cd\u529f\u80fd\u3002\uff08\u4f46\u4ed6\u6709\u4e00\u4e2a\u4ed6\u4eec\u81ea\u5df1\u7684\u6709\u8da3\u7684\u5d4c\u5165\u5f0fSQL\u7684\u6982\u5ff5\u3002\u66f4\u65b0\uff1a\u663e\u7136\u8fd9\u73b0\u5728\u6210\u4e3a\u4e86SQL\u6807\u51c6\u7684\u4e00\u90e8\u5206\u3002\u8fd8\u662f\u5f88\u9177\u3002\u8fd8\u662f\u548c\u6211\u4eec\u8ba4\u4e3a\u7684\u6211\u4eec\u521a\u624d\u8c08\u5230\u7684\u5d4c\u5165\u5f0f\u670d\u52a1\u5668\u4e0d\u662f\u4e00\u4e2a\u4e1c\u897f\u3002\uff09<\/p>\n<p>However, just as  we can&#8217;t rely on the user to set up Strigi\/Nepomuk correctly, we can&#8217;t  rely on them to get their tables set up in MySQL or PostgreSQL.  So we  needed the database to be embeddable, so that it could just work for the  user without any setup necessary on their part.  MySQL, with libmysqld,  had the seeds of this in the 4.1 series, it works decently in 5.0, and  it&#8217;s becoming fully supported (AFAIK) in 5.1.  PostgreSQL, on the other  hand, does not have any such thing.  (They have an <a href=\"http:\/\/www.postgresql.org\/docs\/8.3\/static\/ecpg-concept.html\" target=\"_blank\">interesting and cool concept of their own<\/a> of embedded SQL though.  Update: apparently that is part of the SQL  standard.  Still pretty cool.  Still totally different from what we mean  when we are talking about an embedded server.)<\/p>\n<p>\u8fd9\u4f7f\u6211\u4eec\u53ea\u5269\u4e0b\u4e00\u79cd\u9009\u62e9\u2014\u2014\u6b63\u5982\u4f60\u6240\u731c\u60f3\u7684\u90a3\u6837\u2014\u2014MySQL\u3002\u5b83\u4e5f\u8bb8\u4e0d\u662f\u67d0\u4e9b\u4eba\u6700\u559c\u6b22\u7684\u6570\u636e\u5e93\uff08\u5c3d\u7ba1\u5b83\u662f\u5927\u591a\u6570\u4eba\u7684\uff09\uff0c\u800c\u4e14\u6211\u5e76\u4e0d\u4e86\u89e3\u7a76\u7adf\u5728\u8fd0\u884c\u5d4c\u5165\u5f0f\u6a21\u5f0f\u7684\u65f6\u5019\u591a\u5c11<strong>\u771f\u6b63\u7684<\/strong>\u989d\u5916\u5f00\u9500\uff0c\u4f46\u5b83\u786e\u5b9e\u5b8c\u5168\u7b26\u5408\u8981\u6c42\u3002\u5b83\u540c\u65f6\u53ef\u4ee5\u6309\u5d4c\u5165\u5f0f\u5728\u672c\u5730\u8fd0\u884c\u548c\u6216\u8005\u7528\u72ec\u7acb\u6a21\u5f0f\u5728\u5176\u4ed6\u7684\u673a\u5668\u4e0a\u8fd0\u884c\uff08\u662f\u7684\uff0c\u8fd9\u8fd8\u6ca1\u6709\u5728Amarok2\u5f53\u4e2d\u88ab\u652f\u6301\uff0c\u4f46\u8fd9\u4f1a\u88ab\u652f\u6301\u7684\uff09\u3002\u5bf9\u4e8e\u5927\u6536\u85cf\u6765\u8bf4\uff0c\u5b83\u7684\u901f\u5ea6\u5f88\u5feb\uff0c\u4e5f\u5f88\u5065\u58ee\u3002\u5b83\u88ab\u5f00\u53d1\u7ec4\u7684\u4eba\u5458\u5145\u5206\u4e86\u89e3\u3002\u6700\u91cd\u8981\u7684\uff0c\u5b83\u53ef\u4ee5\u4f5c\u4e3a\u552f\u4e00\u7684\u540e\u7aef\u89e3\u51b3\u6211\u4eec\u6240\u6709\u7684\u9700\u6c42\u3002<\/p>\n<p>So this  leaves us with &#8212; as you guessed &#8212; MySQL.  It may not be any particular  person&#8217;s favorite database (although it is for plenty), and I don&#8217;t  know how much overhead it <strong>really<\/strong> has in embedded form,  but it fit the bill.  It&#8217;s both embeddable and can run standalone on the  local or a separate machine (yes, this is not supported yet in A2, but  it will be).  It is fast and robust for large collections.  It is well  understood by the development team.   And most of all, it is a  single-backend solution that fills all of our needs.<\/p>\n<p>\u5982\u679c\u4f60\u8fd8\u662f\u5bf9\u4e8e\u6211\u4eec\u51b3\u5b9a\u611f\u5230\u4e0d\u6109\u5feb\uff0c\u6211\u5f97\u8bf4\u58f0\u62b1\u6b49\u3002\u6211\u4eec\u5c1d\u8bd5\u53bb\u6ee1\u8db3\u5927\u591a\u6570\u4eba\uff0c\u4f46\u662f\u6ca1\u6cd5\u6ee1\u8db3\u6240\u6709\u4eba\u3002\u4f46\u662f\u662f\u6211\u4eec\u5728\u5f00\u53d1\u5e76\u652f\u6301\u5b83\uff0c\u6240\u4ee5\u6211\u4eec\u624d\u57fa\u4e8e\u6211\u4eec\u5f00\u53d1\u8005\u7684\u9700\u6c42\uff0c\u548c\u6765\u81ea\u6210\u5343\u4e0a\u4e07\u5728\u8fc7\u53bb\u51e0\u5e74\u548c\u6211\u4eec\u6c9f\u901a\u8054\u7cfb\u7684\u7528\u6237\u5171\u540c\u7684\u73b0\u5b9e\u7528\u4f8b\u505a\u51fa\u4e86\u8fd9\u4e2a\u51b3\u5b9a\u3002\u8bf7\u8bb0\u5f97\u5c31\u7b97\u5927\u90e8\u5206\u5728<a href=\"dot.kde.org\">Dot<\/a>\u4e0a\u7684\u7559\u8a00\uff0c\u6216\u8005\u5728\u8fd9\u7bc7\u6587\u7ae0\u540e\u9762\u7684\u8bc4\u8bba\uff08\u4f8b\u5982\u5f88\u591a\u7a81\u7136\u51fa\u73b0\u7684\u56de\u5e94\uff09\u662f\u6765\u81ea\u4e8e\u5bf9\u8fd9\u4e2a\u51b3\u5b9a\u4e0d\u6ee1\u7684\u4eba\uff0c\u8fd9\u4e2a\u51b3\u5b9a\u4e8b\u5b9e\u4e0a\u8fd8\u662f\u9002\u5408\u5927\u591a\u6570\u4eba\u7684\uff0c\u548c\u6211\u4eec\u5176\u4ed6\u9009\u62e9\u76f8\u6bd4\uff0c\u5b83\u662f\u5bf9\u4e8e\u5927\u591a\u6570\u6211\u4eec\u7684\u7528\u6237\u6765\u8bf4\u66f4\u597d\u7684\u51b3\u5b9a\u3002<\/p>\n<p>If  you&#8217;re still unhappy about our decision, I&#8217;m sorry.  We try to please  most and can&#8217;t please everyone.  But we&#8217;re the ones that develop and  support this thing, and so we made a decision based both upon our needs  as developers and the real-world use-cases from the collective feedback  of thousands of users that have contacted us over the last few years.   Please remember that even if most of the comments on the Dot, or to this  post, (i.e. much of the sudden visible feedback) are from people that  are unhappy with our decision, it is a decision that will actually suit  the vast, vast majority of our users better than the other options we  currently have.<\/p>\n<p>\u6211\u4eec\u8fd9\u4e2a\u9879\u76ee\u4f17\u6240\u5468\u77e5\u5bf9\u7528\u6237\u5f88\u53cb\u597d\u2014\u2014\u6211\u4eec\u503e\u542c\u4ed6\u4eec\uff0c\u5c3d\u91cf\u5b9e\u73b0\u4ed6\u4eec\u60f3\u8981\u7684\u7279\u6027\uff0c\u5c3d\u91cf\u54cd\u5e94\u4e0e\u652f\u6301\u3002\u8fd9\u662f\u4f7f\u6211\u4eec\u8d70\u5230\u4eca\u5929\u7684\u4e00\u4e2a\u56e0\u7d20\u3002\u6240\u4ee5\u62dc\u6258\uff0c\u4eb2\u7231\u7684\u8bfb\u8005\u4eec\u2014\u2014\u8bf7\u76f8\u4fe1\u6211\u4eec\u3002\u8fd9\u5e76\u4e0d\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u51b3\u5b9a\u2014\u2014\u6211\u4eec\u8ba8\u8bba\u8fc7\uff0c\u4e89\u8bba\u8fc7\uff0c\u6254\u8fc7\u4e1c\u897f\uff0c\u548c\u89e3\u4e86\uff0c\u6211\u4eec\u5728\u548c\u89e3\u540e\u8fdb\u884c\u4e86\u4e00\u4e24\u6b21\u72c2\u6b22\u2014\u2014\u4f46\u6700\u7ec8\u6211\u4eec\u5168\u4f53\u90fd\u8ba4\u4e3a\u8fd9\u662f\u4e00\u6761\u6b63\u786e\u7684\u8def\uff0c\u5e76\u4e14\u6211\u4eec\u8ba4\u4e3a\uff0c\u7ec8\u7a76\uff0c\u8fd9\u5c06\u4f7f\u5f97Amarok\u66f4\u597d\u3002\u5e0c\u671b\u4f60\u4eec\u4e5f\u8fd9\u4e48\u8ba4\u4e3a\u3002<\/p>\n<p>We&#8217;re a project that is known for being  good to our users &#8212; we listen to them, we try to implement features  they want, try to be responsive with support.  It&#8217;s one of the things  that got us where we are today.  So please, dear readers &#8212; put some  faith in us.  This has not been an easy decision &#8212; we&#8217;ve discussed,  we&#8217;ve argued, we&#8217;ve thrown things, we&#8217;ve made up, we&#8217;ve had an  after-the-make-up orgy or two &#8212; but in the end it&#8217;s what we  collectively felt was the right way to go, and we feel that, in the long  run, it will make Amarok even mores awesomer.  Hopefully you&#8217;ll feel  that way too.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u94fe\u63a5\uff1ahttp:\/\/amarok.kde.org\/blog\/archives\/812-MySQL-in-Amarok-2-The-Reality.html 08\u5e74\u7684\u8001\u6587\uff0c\u770b\u6709\u4eba\u804a\u5230KDE\u91cc\u9762\u7684MySQL\u7528\u7684\u5f88\u591a\u65f6\u641c\u7d22\u4e86\u4e00\u4e0b\uff0c\u7ed3\u679c\u53d1\u73b0\u4e86\u8fd9\u7bc7\u6587\u7ae0\u3002\u8bfb\u5b8c\u4e4b\u540e\uff0c\u7a81\u7136\u60f3\u7ffb\u8bd1\u4e00\u4e0b\u4e86\u3002\u770b\u5230\u6700\u540e\u611f\u89c9\u611f\u89e6\u9887\u6df1\u554a\uff0c\u771f\u7684\uff0c\u5f00\u53d1\u8fc7\u4e00\u4e9b\u5c0f\u73a9\u610f\uff0c\u9762\u5bf9\u7740\u6216\u591a\u6216\u5c11\u7684\u771f\u6b63\u7528\u6237\uff0c\u5fc3\u6709\u621a\u621a\u7109\uff0c\u867d\u7136\u8fd9\u4e48\u8bb2\u4e5f\u8bb8\u6709\u70b9\u5984\u81ea\u5c0a\u5927\uff0c\u53ef\u662f\u8fd8\u662f\u5fcd\u4e0d\u4f4f\uff0c\u60f3\u8981\u505a\u51fa\u66f4\u597d\u7684\u4e1c\u897f\u7ed9\u5927\u5bb6\u2026\u2026\u7ffb\u8bd1\u5b8c\u4e86\u4e4b\u540e\u7565\u4fee\u6539\u4e86\u4e00\u4e0b\uff0c\u7ed3\u679c\u53d1\u73b0\u6709\u5f88\u591a\u770b\u8d77\u6765\u5f88\u56e7\u7684\u9519\u8bef\u2026\u2026\u6709\u4e0d\u5c11\u5730\u65b9\u662f\u610f\u8bd1\uff0c\u6b22\u8fce\u6307\u51fa\u9519\u8bef\u3002\u6bcf\u6bb5\u90fd\u9644\u4e0a\u539f\u6587\u5bf9\u7167\u3002<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[32,213],"class_list":["post-278","post","type-post","status-publish","format-standard","hentry","category-kde","tag-amarok","tag-kde"],"_links":{"self":[{"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/posts\/278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/comments?post=278"}],"version-history":[{"count":11,"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/posts\/278\/revisions"}],"predecessor-version":[{"id":291,"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/posts\/278\/revisions\/291"}],"wp:attachment":[{"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/media?parent=278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/categories?post=278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csslayer.info\/wordpress\/wp-json\/wp\/v2\/tags?post=278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}