<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Georgi.Budinov.com &#187; MySQL</title>
	<atom:link href="http://georgi.budinov.com/category/databases/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://georgi.budinov.com</link>
	<description>The sacred mission of a Web Developer - Get the job done!</description>
	<lastBuildDate>Wed, 02 Nov 2011 13:55:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Adding a number of random generated unique strings into db</title>
		<link>http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/</link>
		<comments>http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 13:47:34 +0000</pubDate>
		<dc:creator>Georgi Budinov</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[unique]]></category>

		<guid isPermaLink="false">http://georgi.budinov.com/?p=862</guid>
		<description><![CDATA[Today I accidentally got to a piece of code I have written long ago and really got surprised from me. I have created a not conventional solution to a interesting problem. Imagine you have to add a bunch of rows into a db table, for example promo codes, that has column holding randomly generated strings. [...]]]></description>
			<content:encoded><![CDATA[<p>Today I accidentally got to a piece of code I have written long ago and really got surprised from me. I have created a not conventional solution to a interesting problem. Imagine you have to add a bunch of rows into a db table, for example promo codes, that has column holding randomly generated strings. The strings should be unique of course, so we have unique key in the db! So instead of generating the string, checking if it is already in the table and if not -&gt; adding it to the table, I have just written this:</p>
<pre class="brush: php;">
$j = 0;
for($i=0; $i&lt;$count; $i++)
{
	while(true)
	{
		try
		{
			$code = str_makerand();
			$codeID = $this-&gt;addItem(
				$this-&gt;tableNameCodes,
				array('code'),
				array($code)
			);

			break;
		}
		catch(Exception $e){
			$j++;
			if($j=10) break;
		}
	}
}
</pre>
<div class="social_bookmark"><script type="text/javascript"><!--
google_ad_client = "pub-1171831089941131";
google_ad_slot = "5499515740";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
</div><!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmark It</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;title=Adding+a+number+of+random+generated+unique+strings+into+db" title="Bookmark 'Adding a number of random generated unique strings into db' in Del.icio.us"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Del.icio.us" alt="Bookmark 'Adding a number of random generated unique strings into db' in Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;title=Adding+a+number+of+random+generated+unique+strings+into+db" title="Bookmark 'Adding a number of random generated unique strings into db' in digg"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Bookmark 'Adding a number of random generated unique strings into db' in digg" alt="Bookmark 'Adding a number of random generated unique strings into db' in digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/" title="Bookmark 'Adding a number of random generated unique strings into db' in Technorati"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Technorati" alt="Bookmark 'Adding a number of random generated unique strings into db' in Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;t=Adding+a+number+of+random+generated+unique+strings+into+db" title="Bookmark 'Adding a number of random generated unique strings into db' in Yahoo My Web"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Yahoo My Web" alt="Bookmark 'Adding a number of random generated unique strings into db' in Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;title=Adding+a+number+of+random+generated+unique+strings+into+db" title="Bookmark 'Adding a number of random generated unique strings into db' in Google Bookmarks"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Google Bookmarks" alt="Bookmark 'Adding a number of random generated unique strings into db' in Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="https://favorites.live.com/quickadd.aspx?url=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;title=Adding+a+number+of+random+generated+unique+strings+into+db" title="Bookmark 'Adding a number of random generated unique strings into db' in Live-MSN"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/live.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Live-MSN" alt="Bookmark 'Adding a number of random generated unique strings into db' in Live-MSN" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;t=Adding+a+number+of+random+generated+unique+strings+into+db" title="Bookmark 'Adding a number of random generated unique strings into db' in FaceBook"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="Bookmark 'Adding a number of random generated unique strings into db' in FaceBook" alt="Bookmark 'Adding a number of random generated unique strings into db' in FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.myspace.com/Modules/PostTo/Pages/?t=Adding+a+number+of+random+generated+unique+strings+into+db&amp;c=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/" title="Bookmark 'Adding a number of random generated unique strings into db' in MySpace"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/myspace.png" title="Bookmark 'Adding a number of random generated unique strings into db' in MySpace" alt="Bookmark 'Adding a number of random generated unique strings into db' in MySpace" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/" title="Bookmark 'Adding a number of random generated unique strings into db' in Twitter"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Twitter" alt="Bookmark 'Adding a number of random generated unique strings into db' in Twitter" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://friendfeed.com/share/bookmarklet/frame#title=Adding+a+number+of+random+generated+unique+strings+into+db&amp;url=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/" title="Bookmark 'Adding a number of random generated unique strings into db' in FriendFeed"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/friendfeed.png" title="Bookmark 'Adding a number of random generated unique strings into db' in FriendFeed" alt="Bookmark 'Adding a number of random generated unique strings into db' in FriendFeed" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/reader/link?url=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/&amp;title=Adding+a+number+of+random+generated+unique+strings+into+db&amp;srcURL=http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/" title="Bookmark 'Adding a number of random generated unique strings into db' in Google Buzz"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/googlebuzz.png" title="Bookmark 'Adding a number of random generated unique strings into db' in Google Buzz" alt="Bookmark 'Adding a number of random generated unique strings into db' in Google Buzz" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://georgi.budinov.com/2011/01/adding-a-number-of-random-generated-unique-strings-into-db/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrating PHPList and CodeIgniter</title>
		<link>http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/</link>
		<comments>http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 10:10:37 +0000</pubDate>
		<dc:creator>Georgi Budinov</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[integration]]></category>
		<category><![CDATA[phplist]]></category>

		<guid isPermaLink="false">http://georgi.budinov.com/?p=835</guid>
		<description><![CDATA[Hello to all. It was a busy month ,so I haven&#8217;t updated this blog for soo loong. Now I give you a small bonus . I was busy with a lot of stuff including writing a library for CodeIgniter dealing with PHPList integration. Before implementing it, I googled a lot for a ready to use [...]]]></description>
			<content:encoded><![CDATA[<p>Hello to all. It was a busy month ,so I haven&#8217;t updated this blog for soo loong. Now I give you a small bonus <img src='http://georgi.budinov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . I was busy with a lot of stuff including writing a library for CodeIgniter dealing with PHPList integration. Before implementing it, I googled a lot for a ready to use library on this particular subject. No luck. So I found myself writing it for an hour and think it is pretty good in doing its job, at least for me <img src='http://georgi.budinov.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Here is the library <span id="more-835"></span>and enjoy.</p>
<p>NOTE: Have in mind that the CI and PHPLIST have a common function named &#8220;redirect&#8221;. You either need to rename that in CI or in PHPLIST.</p>
<pre class="brush: php;">
&lt;?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
* CodeIgniter phplist Library
*
* CodeIgniter phplist bridge allowing adding users to lists and blacklisting them
*
* @author Georgi Budinov
* @version	1.0
* @link http://georgi.budinov.com
*/
class Phplist_library
{
    public $CI;

    /**
     * Constructor.
     */
    public function __construct()
    {
    	global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;
        if (!isset($this-&gt;CI))
		{
			$this-&gt;CI =&amp; get_instance();
		}

		$rootPath = $this-&gt;CI-&gt;config-&gt;item('root_path');

		define('BULLETIN_ROOT_PATH', $rootPath.'bulletin/');

		$phplist_root_path = (defined('PHPLIST_ROOT_PATH')) ? PHPLIST_ROOT_PATH : BULLETIN_ROOT_PATH;

		// Include needed files
		include($phplist_root_path . 'admin/defaultconfig.inc');
		include($phplist_root_path . 'config/config.php');
		include($phplist_root_path . 'admin/mysql.inc');
		include($phplist_root_path . 'admin/connect.php');
    }

    /**
     *
     * @param $email
     * @param $lists
     * @return mixed
     */
    public function user_add($email, $lists = array())
    {
    	if(!$email) return false;

    	if(is_array($lists) &amp;&amp; count($lists))
    	{
    		$userID = addNewUser($email);

    		if($userID &gt; 0)
    		{
    			foreach($lists as $list)
    			{
    				$this-&gt;userAddToList($userID, $list);
    			}
    		}
    	}
    	else
    	{
        	return addNewUser($email);
    	}
    }

	public function get_lists()
    {
    	$results = $this-&gt;getLists();

    	return $results;
    }

	public function user_add_list($email, $list)
    {
    	if(!$email || !$list) return;

    	$userid = $this-&gt;getUserIDByEmail($email);

    	if($userid &gt; 0)
    	{
    		$this-&gt;userAddToList($userid, $list);
    	}
    	else
    	{
    		return;
    	}
    }

	public function user_remove_list($email, $list)
    {
    	if(!$email || !$list) return;

    	$userid = $this-&gt;getUserIDByEmail($email);

    	if($userid &gt; 0)
    	{
    		$this-&gt;userRemoveToList($userid, $list);
    	}
    	else
    	{
    		return;
    	}
    }

    /**
     *
     * @param $email
     * @return mixed
     */
    public function user_blacklist($email)
    {
    	if(!$email) return;

    	return addUserToBlackList($email);
    }

	/**
     *
     * @param $email
     * @return mixed
     */
    public function user_unblacklist($email)
    {
    	if(!$email) return;

    	$userid = $this-&gt;getUserIDByEmail($email);

    	if($userid &gt; 0)
    	{
    		return unBlackList($userid);
    	}
    	else
    	{
    		return false;
    	}
    }

	private function getUserIDByEmail($email = '') {
	  global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;
	  if (!$email) return;

	  # workaround for integration webbler/phplist
	  if (!isset($table_prefix))
	    $table_prefix = &quot;phplist_&quot;;

	  if (isset($tables[&quot;attribute&quot;])) {
	    $att_table = $tables[&quot;attribute&quot;];
	    $user_att_table = $tables[&quot;user_attribute&quot;];
	    $usertable = $tables[&quot;user&quot;];
	  } else {
	    $att_table = &quot;attribute&quot;;
	    $user_att_table = &quot;user_attribute&quot;;
	    $usertable = &quot;user&quot;;
	  }
	  $email = mysql_real_escape_string($email, $database_connection);
	  $userid = Sql_Fetch_Row_Query(&quot;select id from {$usertable} where email = \&quot;$email\&quot;&quot;);
	  $id = $userid[0];

	  return $id;
	}

	private function userAddToList($id = 0, $listID = 0)
	{
		global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;

		$id = intval($id);
		$listID = intval($listID);
		if(!$id || !$listID) return false;

		$query = &quot;replace into &quot;.$tables[&quot;listuser&quot;].&quot; (userid,listid,entered) values($id,$listID,now())&quot;;
	    $result = Sql_query($query);
	}

	private function userRemoveToList($id = 0, $listID = 0)
	{
		global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;

		$id = intval($id);
		$listID = intval($listID);
		if(!$id || !$listID) return false;

		$query = &quot;delete from &quot;.$tables[&quot;listuser&quot;].&quot; where userid = $id and listid = $listID&quot;;
	    $result = Sql_query($query);
	}

	private function getLists()
	{
		global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;

		$results = array();
		$result = Sql_query(&quot;SELECT * FROM {$tables['list']} order by listorder&quot;);
		while ($row = Sql_fetch_array($result))
		{
			$results[$row['id']] = $row;
		}

		return $results;
	}
}

/* End of file phplist_library.php */
/* Location: ./application/libraries/phplist_library.php */
</pre>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">
<p>&lt;?php if (!defined(&#8216;BASEPATH&#8217;)) exit(&#8216;No direct script access allowed&#8217;);</p>
<p>/**<br />
* CodeIgniter phplist Library<br />
*<br />
* CodeIgniter phplist bridge allowing adding users to lists and blacklisting them<br />
*<br />
* @author Georgi Budinov<br />
* @version    1.0<br />
* @link http://georgi.budinov.com<br />
*/<br />
class Phplist_library<br />
{<br />
public $CI;</p>
<p>/**<br />
* Constructor.<br />
*/<br />
public function __construct()<br />
{<br />
global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;<br />
if (!isset($this-&gt;CI))<br />
{<br />
$this-&gt;CI =&amp; get_instance();<br />
}</p>
<p>$rootPath = $this-&gt;CI-&gt;config-&gt;item(&#8216;root_path&#8217;);</p>
<p>define(&#8216;BULLETIN_ROOT_PATH&#8217;, $rootPath.&#8217;bulletin/&#8217;);</p>
<p>$phplist_root_path = (defined(&#8216;PHPLIST_ROOT_PATH&#8217;)) ? PHPLIST_ROOT_PATH : BULLETIN_ROOT_PATH;</p>
<p>// Include needed files<br />
include($phplist_root_path . &#8216;admin/defaultconfig.inc&#8217;);<br />
include($phplist_root_path . &#8216;config/config.php&#8217;);<br />
include($phplist_root_path . &#8216;admin/mysql.inc&#8217;);<br />
include($phplist_root_path . &#8216;admin/connect.php&#8217;);<br />
}</p>
<p>/**<br />
*<br />
* @param $email<br />
* @param $lists<br />
* @return mixed<br />
*/<br />
public function user_add($email, $lists = array())<br />
{<br />
if(!$email) return false;</p>
<p>if(is_array($lists) &amp;&amp; count($lists))<br />
{<br />
$userID = addNewUser($email);</p>
<p>if($userID &gt; 0)<br />
{<br />
foreach($lists as $list)<br />
{<br />
$this-&gt;userAddToList($userID, $list);<br />
}<br />
}<br />
}<br />
else<br />
{<br />
return addNewUser($email);<br />
}<br />
}</p>
<p>public function get_lists()<br />
{<br />
$results = $this-&gt;getLists();</p>
<p>return $results;<br />
}</p>
<p>public function user_add_list($email, $list)<br />
{<br />
if(!$email || !$list) return;</p>
<p>$userid = $this-&gt;getUserIDByEmail($email);</p>
<p>if($userid &gt; 0)<br />
{<br />
$this-&gt;userAddToList($userid, $list);<br />
}<br />
else<br />
{<br />
return;<br />
}<br />
}</p>
<p>public function user_remove_list($email, $list)<br />
{<br />
if(!$email || !$list) return;</p>
<p>$userid = $this-&gt;getUserIDByEmail($email);</p>
<p>if($userid &gt; 0)<br />
{<br />
$this-&gt;userRemoveToList($userid, $list);<br />
}<br />
else<br />
{<br />
return;<br />
}<br />
}</p>
<p>/**<br />
*<br />
* @param $email<br />
* @return mixed<br />
*/<br />
public function user_blacklist($email)<br />
{<br />
if(!$email) return;</p>
<p>return addUserToBlackList($email);<br />
}</p>
<p>/**<br />
*<br />
* @param $email<br />
* @return mixed<br />
*/<br />
public function user_unblacklist($email)<br />
{<br />
if(!$email) return;</p>
<p>$userid = $this-&gt;getUserIDByEmail($email);</p>
<p>if($userid &gt; 0)<br />
{<br />
return unBlackList($userid);<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}</p>
<p>private function getUserIDByEmail($email = &#8221;) {<br />
global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;<br />
if (!$email) return;</p>
<p># workaround for integration webbler/phplist<br />
if (!isset($table_prefix))<br />
$table_prefix = &#8220;phplist_&#8221;;</p>
<p>if (isset($tables["attribute"])) {<br />
$att_table = $tables["attribute"];<br />
$user_att_table = $tables["user_attribute"];<br />
$usertable = $tables["user"];<br />
} else {<br />
$att_table = &#8220;attribute&#8221;;<br />
$user_att_table = &#8220;user_attribute&#8221;;<br />
$usertable = &#8220;user&#8221;;<br />
}<br />
$email = mysql_real_escape_string($email, $database_connection);<br />
$userid = Sql_Fetch_Row_Query(&#8220;select id from {$usertable} where email = \&#8221;$email\&#8221;");<br />
$id = $userid[0];</p>
<p>return $id;<br />
}</p>
<p>private function userAddToList($id = 0, $listID = 0)<br />
{<br />
global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;</p>
<p>$id = intval($id);<br />
$listID = intval($listID);<br />
if(!$id || !$listID) return false;</p>
<p>$query = &#8220;replace into &#8220;.$tables["listuser"].&#8221; (userid,listid,entered) values($id,$listID,now())&#8221;;<br />
$result = Sql_query($query);<br />
}</p>
<p>private function userRemoveToList($id = 0, $listID = 0)<br />
{<br />
global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;</p>
<p>$id = intval($id);<br />
$listID = intval($listID);<br />
if(!$id || !$listID) return false;</p>
<p>$query = &#8220;delete from &#8220;.$tables["listuser"].&#8221; where userid = $id and listid = $listID&#8221;;<br />
$result = Sql_query($query);<br />
}</p>
<p>private function getLists()<br />
{<br />
global $tables, $table_prefix, $config, $usertable_prefix, $database_connection;</p>
<p>$results = array();<br />
$result = Sql_query(&#8220;SELECT * FROM {$tables['list']} order by listorder&#8221;);<br />
while ($row = Sql_fetch_array($result))<br />
{<br />
$results[$row['id']] = $row;<br />
}</p>
<p>return $results;<br />
}<br />
}</p>
<p>/* End of file phplist_library.php */<br />
/* Location: ./application/libraries/phplist_library.php */</p>
</div>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmark It</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;title=Integrating+PHPList+and+CodeIgniter" title="Bookmark 'Integrating PHPList and CodeIgniter' in Del.icio.us"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Del.icio.us" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;title=Integrating+PHPList+and+CodeIgniter" title="Bookmark 'Integrating PHPList and CodeIgniter' in digg"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in digg" alt="Bookmark 'Integrating PHPList and CodeIgniter' in digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/" title="Bookmark 'Integrating PHPList and CodeIgniter' in Technorati"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Technorati" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;t=Integrating+PHPList+and+CodeIgniter" title="Bookmark 'Integrating PHPList and CodeIgniter' in Yahoo My Web"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Yahoo My Web" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;title=Integrating+PHPList+and+CodeIgniter" title="Bookmark 'Integrating PHPList and CodeIgniter' in Google Bookmarks"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Google Bookmarks" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="https://favorites.live.com/quickadd.aspx?url=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;title=Integrating+PHPList+and+CodeIgniter" title="Bookmark 'Integrating PHPList and CodeIgniter' in Live-MSN"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/live.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Live-MSN" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Live-MSN" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;t=Integrating+PHPList+and+CodeIgniter" title="Bookmark 'Integrating PHPList and CodeIgniter' in FaceBook"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in FaceBook" alt="Bookmark 'Integrating PHPList and CodeIgniter' in FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.myspace.com/Modules/PostTo/Pages/?t=Integrating+PHPList+and+CodeIgniter&amp;c=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/" title="Bookmark 'Integrating PHPList and CodeIgniter' in MySpace"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/myspace.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in MySpace" alt="Bookmark 'Integrating PHPList and CodeIgniter' in MySpace" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/" title="Bookmark 'Integrating PHPList and CodeIgniter' in Twitter"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Twitter" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Twitter" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://friendfeed.com/share/bookmarklet/frame#title=Integrating+PHPList+and+CodeIgniter&amp;url=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/" title="Bookmark 'Integrating PHPList and CodeIgniter' in FriendFeed"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/friendfeed.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in FriendFeed" alt="Bookmark 'Integrating PHPList and CodeIgniter' in FriendFeed" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/reader/link?url=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/&amp;title=Integrating+PHPList+and+CodeIgniter&amp;srcURL=http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/" title="Bookmark 'Integrating PHPList and CodeIgniter' in Google Buzz"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/googlebuzz.png" title="Bookmark 'Integrating PHPList and CodeIgniter' in Google Buzz" alt="Bookmark 'Integrating PHPList and CodeIgniter' in Google Buzz" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://georgi.budinov.com/2010/10/integrating-phplist-and-codeigniter/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Database architecture for multilingual content</title>
		<link>http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/</link>
		<comments>http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 21:14:00 +0000</pubDate>
		<dc:creator>Georgi Budinov</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[multilingual]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://georgi.budinov.com/?p=521</guid>
		<description><![CDATA[Recently I had a discussion at work about database architecture supporting multilingual content again. This is a question that is been asked for so long &#8211; How to design the database to enable multilingual content ? Ok here the main goals are two: performance easy management &#8211; adding new fields, deleting existing fields and so [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I had a discussion at work about database architecture supporting multilingual content again. This is a question that is been asked for so long &#8211; How to design the database to enable multilingual content ? Ok here the main goals are two:<br />
<span id="more-521"></span></p>
<ul>
<li>performance</li>
<li>easy management &#8211; adding new fields, deleting existing fields and so on</li>
</ul>
<p>As I see it, there are three approaches that deserve our attention:</p>
<ul>
<li>the most common, mostly used in the past (according to me) &#8211; single table holding all the fields: common fields + language fields</li>
<li>the multilanguage tables &#8211; each language has own table that complement the data in the common table</li>
<li>single multilanguage table complementing the common table &#8211; the multilingual table has a primary key on id from the common table and the language</li>
</ul>
<p>So I decided to investigate what is the best solution to use. Here is the database structure I used:</p>
<ul>
<li>the first way:</li>
</ul>
<p>CREATE TABLE IF NOT EXISTS `simplest` (<br />
`id` int(11) NOT NULL AUTO_INCREMENT,<br />
`title_en` varchar(255) NOT NULL DEFAULT &#8216; &#8216;,<br />
`title_bg` varchar(255) NOT NULL DEFAULT &#8216; &#8216;,<br />
`body_en` text NOT NULL,<br />
`body_bg` text NOT NULL,<br />
`sum_en` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
`sum_bg` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=utf8</p>
<ul>
<li>the second way</li>
</ul>
<p>CREATE TABLE IF NOT EXISTS `lang_tbls` (<br />
`id` int(20) NOT NULL AUTO_INCREMENT,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM</p>
<p>CREATE TABLE IF NOT EXISTS `lang_tbls_bg` (<br />
`id` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
`title` varchar(255) NOT NULL DEFAULT &#8216; &#8216;,<br />
`body` text NOT NULL,<br />
`sum` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
KEY `id` (`id`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<p>CREATE TABLE IF NOT EXISTS `lang_tbls_en` (<br />
`id` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
`title` varchar(255) NOT NULL DEFAULT &#8216; &#8216;,<br />
`body` text NOT NULL,<br />
`sum` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
KEY `id` (`id`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<ul>
<li>and the third option</li>
</ul>
<p>CREATE TABLE IF NOT EXISTS `one_tbl` (<br />
`id` int(20) NOT NULL AUTO_INCREMENT,<br />
PRIMARY KEY (`id`)<br />
) ENGINE=MyISAM</p>
<p>CREATE TABLE IF NOT EXISTS `one_tbl_lang` (<br />
`id` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
`lang` char(2) NOT NULL DEFAULT &#8216;en&#8217;,<br />
`title` varchar(255) NOT NULL DEFAULT &#8216; &#8216;,<br />
`body` text NOT NULL,<br />
`sum` int(11) NOT NULL DEFAULT &#8217;0&#8242;,<br />
PRIMARY KEY (`id`,`lang`)<br />
) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<p>Now as we know what are the options in details let us first see what is the best structure to be easy to maintain and extend. As you can suppose this is the last one. When needed to add a new lang &#8230; nothing to be done in the database. When needed to add a new field &#8230;. just alter one table. Between the first two choices better is the second just because the languages are separated and it is easier to manage, but having more tables of course.</p>
<p>Ok now the real deal &#8211; performace. I have created the structure above on my localhost mysql database. Then made a script and imported data of 5000 rows and then 10000 rows. Ran a few queries that according to me are mostly used and important to make the difference. And these are the results:</p>
<p>0.0018 sec/5000 rec, 0.0018 sec/10000 rec,<br />
SELECT * FROM `simplest` WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0064 sec/5000 rec, 0.0152 sec/10000 rec,<br />
SELECT * FROM `simplest` WHERE title_en LIKE &#8216;%ass%&#8217; LIMIT 20<br />
0.0090 sec/5000 rec, 0.0190 sec/10000 rec,<br />
SELECT * FROM `simplest` WHERE title_en LIKE &#8216;%ass%&#8217; OR title_bg LIKE &#8216;%ass%&#8217; LIMIT 20</p>
<p>0.0030 sec/5000 rec, 0.0037 sec/10000 rec<br />
SELECT * FROM `lang_tbls` t INNER JOIN `lang_tbls_en` l ON (t.id = l.id) WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0057 sec/5000 rec, 0.0060 sec/10000 rec<br />
SELECT * FROM `lang_tbls` t INNER JOIN `lang_tbls_en` l ON (t.id = l.id) WHERE l.title LIKE &#8216;%ass%&#8217; LIMIT 10<br />
0.0116 sec/5000 rec, 0.0120 sec/10000 rec<br />
SELECT * FROM `lang_tbls` t INNER JOIN `lang_tbls_en` l1 ON (t.id = l1.id) INNER JOIN `lang_tbls_bg` l2 ON (t.id = l2.id) WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0292 sec/5000 rec, 0.0325 sec/10000 rec<br />
SELECT * FROM `lang_tbls` t INNER JOIN `lang_tbls_en` l1 ON (t.id = l1.id) INNER JOIN `lang_tbls_bg` l2 ON (t.id = l2.id) WHERE l1.title LIKE &#8216;%ass%&#8217; OR l2.title LIKE &#8216;%ass%&#8217; LIMIT 10<br />
0.0157 sec/5000 rec, 0.0175 sec/10000 rec<br />
SELECT * FROM `lang_tbls` t LEFT JOIN `lang_tbls_en` l1 ON (t.id = l1.id) LEFT JOIN `lang_tbls_bg` l2 ON (t.id = l2.id) WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0405 sec/5000 rec, 0.0445 sec/10000 rec<br />
SELECT * FROM `lang_tbls` t LEFT JOIN `lang_tbls_en` l1 ON (t.id = l1.id) LEFT JOIN `lang_tbls_bg` l2 ON (t.id = l2.id) WHERE l1.title LIKE &#8216;%ass%&#8217; OR l2.title LIKE &#8216;%ass%&#8217; LIMIT 10</p>
<p>0.0098 sec/5000 rec, 0.0099 sec/10000 rec<br />
SELECT * FROM `one_tbl` t INNER JOIN `one_tbl_lang` l ON (t.id = l.id AND l.lang = &#8216;en&#8217;) WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0430 sec/5000 rec, 0.0470 sec/10000 rec<br />
SELECT * FROM `one_tbl` t INNER JOIN `one_tbl_lang` l ON (t.id = l.id AND l.lang = &#8216;en&#8217;) WHERE l.title LIKE &#8216;%ass%&#8217; LIMIT 10<br />
0.0025 sec/5000 rec, 0.0030 sec/10000 rec<br />
SELECT * FROM `one_tbl` t INNER JOIN `one_tbl_lang` l ON (t.id = l.id AND (l.lang = &#8216;en&#8217; OR l.lang = &#8216;bg&#8217;)) WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0060 sec/5000 rec, 0.0067 sec/5000 rec<br />
SELECT * FROM `one_tbl` t INNER JOIN `one_tbl_lang` l ON (t.id = l.id AND (l.lang = &#8216;en&#8217; OR l.lang = &#8216;bg&#8217;)) WHERE l.title LIKE &#8216;%ass%&#8217; LIMIT 10<br />
0.0170 sec/5000 rec, 0.0184 sec/5000 rec<br />
SELECT * FROM `one_tbl` t LEFT JOIN `one_tbl_lang` l1 ON (t.id = l1.id AND l1.lang = &#8216;en&#8217;) LEFT JOIN `one_tbl_lang` l2 ON (t.id = l2.id AND l2.lang = &#8216;bg&#8217;) WHERE 1 LIMIT 20 OFFSET 1000<br />
0.0457 sec/5000 rec, 0.0485 sec/10000 rec<br />
SELECT * FROM `one_tbl` t LEFT JOIN `one_tbl_lang` l1 ON (t.id = l1.id AND l1.lang = &#8216;en&#8217;) LEFT JOIN `one_tbl_lang` l2 ON (t.id = l2.id AND l2.lang = &#8216;bg&#8217;) WHERE l1.title LIKE &#8216;%ass%&#8217; OR l2.title LIKE &#8216;%ass%&#8217; LIMIT 10</p>
<p>I think that it is really clear the the first choice is best in terms of performance. The queries I have used for the latter options are more because there is difference in what exactly you want to get from the database using different types of joins, which one can do with no joins in the first option. So if you want to emphasis on performance that is for you!</p>
<p>Ok let&#8217;s move on &#8211; the second and the third. As you can see the third option is better just in queries 3 and 4 &#8211; quite better I would say. But according to me these queries are queries that are rarely used. The can be used for searches in the databases for both languages which is really rare wanted feature, really. In all other queries the second option is better. So if you want to emphasis on maintenance and easy development &#8211; option 3 is for you.</p>
<p>But if you want to be between the two requirements &#8211; use the second option.</p>
<!-- Social Bookmarking Reloaded BEGIN --><div class="social_bookmark"><em>Bookmark It</em><br /><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;title=Database+architecture+for+multilingual+content" title="Bookmark 'Database architecture for multilingual content' in Del.icio.us"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/delicious.png" title="Bookmark 'Database architecture for multilingual content' in Del.icio.us" alt="Bookmark 'Database architecture for multilingual content' in Del.icio.us" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;title=Database+architecture+for+multilingual+content" title="Bookmark 'Database architecture for multilingual content' in digg"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/digg.png" title="Bookmark 'Database architecture for multilingual content' in digg" alt="Bookmark 'Database architecture for multilingual content' in digg" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/" title="Bookmark 'Database architecture for multilingual content' in Technorati"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/technorati.png" title="Bookmark 'Database architecture for multilingual content' in Technorati" alt="Bookmark 'Database architecture for multilingual content' in Technorati" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;t=Database+architecture+for+multilingual+content" title="Bookmark 'Database architecture for multilingual content' in Yahoo My Web"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/yahoo_myweb.png" title="Bookmark 'Database architecture for multilingual content' in Yahoo My Web" alt="Bookmark 'Database architecture for multilingual content' in Yahoo My Web" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;title=Database+architecture+for+multilingual+content" title="Bookmark 'Database architecture for multilingual content' in Google Bookmarks"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/google.png" title="Bookmark 'Database architecture for multilingual content' in Google Bookmarks" alt="Bookmark 'Database architecture for multilingual content' in Google Bookmarks" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="https://favorites.live.com/quickadd.aspx?url=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;title=Database+architecture+for+multilingual+content" title="Bookmark 'Database architecture for multilingual content' in Live-MSN"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/live.png" title="Bookmark 'Database architecture for multilingual content' in Live-MSN" alt="Bookmark 'Database architecture for multilingual content' in Live-MSN" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/share.php?u=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;t=Database+architecture+for+multilingual+content" title="Bookmark 'Database architecture for multilingual content' in FaceBook"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/facebook.png" title="Bookmark 'Database architecture for multilingual content' in FaceBook" alt="Bookmark 'Database architecture for multilingual content' in FaceBook" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.myspace.com/Modules/PostTo/Pages/?t=Database+architecture+for+multilingual+content&amp;c=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/" title="Bookmark 'Database architecture for multilingual content' in MySpace"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/myspace.png" title="Bookmark 'Database architecture for multilingual content' in MySpace" alt="Bookmark 'Database architecture for multilingual content' in MySpace" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home?status=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/" title="Bookmark 'Database architecture for multilingual content' in Twitter"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/twitter.png" title="Bookmark 'Database architecture for multilingual content' in Twitter" alt="Bookmark 'Database architecture for multilingual content' in Twitter" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://friendfeed.com/share/bookmarklet/frame#title=Database+architecture+for+multilingual+content&amp;url=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/" title="Bookmark 'Database architecture for multilingual content' in FriendFeed"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/friendfeed.png" title="Bookmark 'Database architecture for multilingual content' in FriendFeed" alt="Bookmark 'Database architecture for multilingual content' in FriendFeed" /></a><a class="social_img" onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,border=0,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/reader/link?url=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/&amp;title=Database+architecture+for+multilingual+content&amp;srcURL=http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/" title="Bookmark 'Database architecture for multilingual content' in Google Buzz"><img src="http://georgi.budinov.com/wp-content/plugins/social-bookmarking-reloaded/googlebuzz.png" title="Bookmark 'Database architecture for multilingual content' in Google Buzz" alt="Bookmark 'Database architecture for multilingual content' in Google Buzz" /></a></div>
<!-- Social Bookmarking Reloaded END -->]]></content:encoded>
			<wfw:commentRss>http://georgi.budinov.com/2010/07/database-architecture-for-multilingual-content/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

