<?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>goodguy о разработке &#187; Базы данных</title>
	<atom:link href="http://dev.good-guy.me/archives/category/databases/feed" rel="self" type="application/rss+xml" />
	<link>http://dev.good-guy.me</link>
	<description>python, zope, php, sqlite, postgresql, mysql и прочее с чем сталкиваюсь</description>
	<lastBuildDate>Thu, 08 Jul 2010 09:17:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Сколько же записей обновилось?</title>
		<link>http://dev.good-guy.me/archives/349</link>
		<comments>http://dev.good-guy.me/archives/349#comments</comments>
		<pubDate>Mon, 30 Mar 2009 12:43:48 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Языки]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=349</guid>
		<description><![CDATA[Вроде бы простой вопрос, сколько рядов было затронуто SQL-операцией UPDATE, но и здесь притаился подводный камень (о котором, правда честно предупреждают в документации). В MySQL в это число могут не попадать записи, у которых данные не потребовалось изменять. А значит, если REPLACE не подходит, то нужно проводить дополнительные проверки на тему того, сколько же данных [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Вроде бы простой вопрос, сколько рядов было затронуто SQL-операцией <tt>UPDATE</tt>, но и здесь притаился подводный камень (о котором, правда честно предупреждают в документации). В MySQL в это число могут не попадать записи, у которых данные не потребовалось изменять. А значит, если <tt>REPLACE</tt> не подходит, то нужно проводить дополнительные проверки на тему того, сколько же данных вы обновили. Я споткнулся об этом в функции <tt><a href="http://ru2.php.net/manual/en/function.mysql-affected-rows.php">mysql_affected_rows</a></tt> в PHP. Там-же можно найти один из вариантов решения &#8211; использовать <tt><a href="http://ru2.php.net/manual/en/function.mysql-info.php">mysql_info</a></tt>, но в этом случае нужно парсить строку с ответом. Ну а дальше в вариантах <tt>SELECT</tt>&#8216;ы и т.п.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/349/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SQLite и JOIN</title>
		<link>http://dev.good-guy.me/archives/322</link>
		<comments>http://dev.good-guy.me/archives/322#comments</comments>
		<pubDate>Fri, 06 Mar 2009 09:25:49 +0000</pubDate>
		<dc:creator>goodguy</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[berkleydb]]></category>
		<category><![CDATA[sqlite]]></category>

		<guid isPermaLink="false">http://dev.goodguy.spb.ru/?p=322</guid>
		<description><![CDATA[Обычно по работе, когда требуется сохранить какую-то информацию (вроде справочников абонентов) в компоненте, которая отвязана от основного проекта, я стараюсь использовать BerkleyDB. Она быстра, когда для доступа используется только какой-то ключ и вполне практична. Но в одном из проектов с ростом количества доступов к файлу базы от разных потоков стали происходить коллизии и терялись части [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify">Обычно по работе, когда требуется сохранить какую-то информацию (вроде справочников абонентов) в компоненте, которая отвязана от основного проекта, я стараюсь использовать <a href="http://www.oracle.com/technology/products/berkeley-db/index.html">BerkleyDB</a>. Она быстра, когда для доступа используется только какой-то ключ и вполне практична. Но в одном из проектов с ростом количества доступов к файлу базы от разных потоков стали происходить коллизии и терялись части данных (частично виню в этом механизм доступа, реализованный в PHP, частично &#8211; недоработки в компоненте). К тому же усложнялась структура данных, хранящихся в каждом ключе. Для разрешения вопроса был выбран <a href="http://www.sqlite.org/">SQLite</a>, т.к. с ним возможно разрисовать структуру данных, и поддерживается одновременная работа с одной базой.</p>
<p style="text-align: justify">В ходе проверок запросов выяснился весьма интересный момент. В привычных мне ранее PostgreSQL или MySQL конструкция вида:
</p>
<pre name="code" class="sql:nocontrols">
SELECT b.id, f.title as foo_title, b.title
FROM bar b LEFT JOIN foo f ON f.id=b.foo_id
</pre>
<p style="text-align: justify">будет отрабатывать вполне успешно. Но не в SQLite. И дело не только в том, что конструкцию с <tt>JOIN</tt> надо заключать в круглые скобки. Внутренняя логика SQLite превращает это выражение в один источник и не позволяет выделить из какой именно таблицы тебе нужно взять поле. И в данном примере значение <tt>title</tt> из <tt>foo</tt> перекроет значение <tt>title</tt> из <tt>bar</tt>. Т.е. результатом запроса вида:</p>
<pre name="code" class="sql:nocontrols">
SELECT id, title
FROM (bar b LEFT JOIN foo f ON f.id=b.foo_id)
</pre>
<p style="text-align: justify">Будут значения <tt>id</tt> и <tt>title</tt> из таблицы <tt>foo</tt>. Выход один: делать объединение таблиц в конструкции <tt>WHERE</tt>, тем более, как говорит <a href="http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning">документация</a> потери быстродействия в этом случае не будет.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.good-guy.me/archives/322/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
