<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: An alternative way of EAV modelling</title>
	<atom:link href="http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/</link>
	<description>Helping you out with PHP &#38; MySQL</description>
	<lastBuildDate>Wed, 25 Jan 2012 21:57:47 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Arnold Daniels</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-338150</link>
		<dc:creator>Arnold Daniels</dc:creator>
		<pubDate>Fri, 13 Jan 2012 01:37:15 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-338150</guid>
		<description>Using a full-text index for is another option. You should write an article explaining how you would do that.

Have a look at the results below.

&lt;pre&gt;
mysql&gt; show create table product_property_test;
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
&#124; Table                 &#124; Create Table                                                                                                                                                                                                                                                                                                                                                                                                            &#124;
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
&#124; product_property_test &#124; CREATE TABLE `product_property_test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(10) unsigned NOT NULL,
  `property_id` int(10) unsigned NOT NULL,
  `value` int(11) NOT NULL,
  `text` text,
  PRIMARY KEY (`id`),
  KEY `product_id` (`product_id`,`property_id`),
  KEY `property_id` (`property_id`,`value`)
) ENGINE=InnoDB AUTO_INCREMENT=79187 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC &#124;
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql&gt; SELECT COUNT(*) FROM `product_property_test`;
+----------+
&#124; COUNT(*) &#124;
+----------+
&#124;    47340 &#124;
+----------+
1 row in set (0.04 sec)

mysql&gt; SELECT product_id FROM `product_property_test` WHERE ( property_id =65854 AND value =5493 ) OR ( property_id =65854 AND value =5491 ) OR ( property_id =65863 AND value =5498 ) GROUP BY product_id HAVING COUNT(*) = 3;
+------------+
&#124; product_id &#124;
+------------+
&#124;       9541 &#124;
&#124;      46210 &#124;
&#124;      74013 &#124;
&#124;      88603 &#124;
&#124;      88717 &#124;
&#124;     209541 &#124;
&#124;     246210 &#124;
&#124;     274013 &#124;
&#124;     288603 &#124;
&#124;     288717 &#124;
&#124;     409541 &#124;
&#124;     446210 &#124;
&#124;     474013 &#124;
&#124;     488603 &#124;
&#124;     488717 &#124;
&#124;     609541 &#124;
&#124;     646210 &#124;
&#124;     674013 &#124;
&#124;     688603 &#124;
&#124;     688717 &#124;
&#124;     809541 &#124;
&#124;     846210 &#124;
&#124;     874013 &#124;
&#124;     888603 &#124;
&#124;    1046210 &#124;
&#124;    1246210 &#124;
&#124;    1446210 &#124;
&#124;    1646210 &#124;
+------------+
28 rows in set (0.00 sec)

mysql&gt; EXPLAIN SELECT product_id FROM `product_property_test` WHERE ( property_id =65854 AND value =5493 ) OR ( property_id =65854 AND value =5491 ) OR ( property_id =65863 AND value =5498 ) GROUP BY product_id HAVING COUNT(*) = 3;
+----+-------------+-----------------------+-------+---------------+-------------+---------+------+------+----------------------------------------------+
&#124; id &#124; select_type &#124; table                 &#124; type  &#124; possible_keys &#124; key         &#124; key_len &#124; ref  &#124; rows &#124; Extra                                        &#124;
+----+-------------+-----------------------+-------+---------------+-------------+---------+------+------+----------------------------------------------+
&#124;  1 &#124; SIMPLE      &#124; product_property_test &#124; range &#124; property_id   &#124; property_id &#124; 8       &#124; NULL &#124;  124 &#124; Using where; Using temporary; Using filesort &#124;
+----+-------------+-----------------------+-------+---------------+-------------+---------+------+------+----------------------------------------------+
1 row in set (0.00 sec)
&lt;/pre&gt;

So it&#039;s finding 124 instances of one of the property/value combinations. It needs to create a temp table and do a filesort for the group by and having. Now if that value was a lot bigger, like &gt; 10000, things would start to slow down. Also if you would filter on a large number of properties, the temp table will grow.

Remember that there are a lot of different properties, so one of these properties is only used in a small subset of the product. If let&#039;s say &gt; 5% of the products has a specific property, we should just add a column to the product table.

Now in reality you&#039;d probably not just search using the properties, but filter on fields from the product table as well. This should also limit the number of matching property/value pairs found.

&lt;pre&gt;
SELECT product.* FROM product INNER JOIN product_property_test q ON product.id = q.product_id WHERE product.category_id = 200 AND ( ( property_id =65854 AND value =5493 ) OR ( property_id =65854 AND value =5491 ) OR ( property_id =65863 AND value =5498 ) ) GROUP BY product_id HAVING COUNT(*) = 3
&lt;/pre&gt;

So in practise this will scale well up to a couple million products. If you have more than that you should look at a different solution, like combining Redis and MySQL.

@Jaimie, I hope your questions are hereby answered. I agree that this isn&#039;t the right way to go for all occasions, but it&#039;s definitely useful for the situation as described above. If you want to discuss this further, please come with practical examples of where, why and how problems will arise.</description>
		<content:encoded><![CDATA[<p>Using a full-text index for is another option. You should write an article explaining how you would do that.</p>
<p>Have a look at the results below.</p>
<pre>
mysql> show create table product_property_test;
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table                 | Create Table                                                                                                                                                                                                                                                                                                                                                                                                            |
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| product_property_test | CREATE TABLE `product_property_test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(10) unsigned NOT NULL,
  `property_id` int(10) unsigned NOT NULL,
  `value` int(11) NOT NULL,
  `text` text,
  PRIMARY KEY (`id`),
  KEY `product_id` (`product_id`,`property_id`),
  KEY `property_id` (`property_id`,`value`)
) ENGINE=InnoDB AUTO_INCREMENT=79187 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC |
+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM `product_property_test`;
+----------+
| COUNT(*) |
+----------+
|    47340 |
+----------+
1 row in set (0.04 sec)

mysql> SELECT product_id FROM `product_property_test` WHERE ( property_id =65854 AND value =5493 ) OR ( property_id =65854 AND value =5491 ) OR ( property_id =65863 AND value =5498 ) GROUP BY product_id HAVING COUNT(*) = 3;
+------------+
| product_id |
+------------+
|       9541 |
|      46210 |
|      74013 |
|      88603 |
|      88717 |
|     209541 |
|     246210 |
|     274013 |
|     288603 |
|     288717 |
|     409541 |
|     446210 |
|     474013 |
|     488603 |
|     488717 |
|     609541 |
|     646210 |
|     674013 |
|     688603 |
|     688717 |
|     809541 |
|     846210 |
|     874013 |
|     888603 |
|    1046210 |
|    1246210 |
|    1446210 |
|    1646210 |
+------------+
28 rows in set (0.00 sec)

mysql> EXPLAIN SELECT product_id FROM `product_property_test` WHERE ( property_id =65854 AND value =5493 ) OR ( property_id =65854 AND value =5491 ) OR ( property_id =65863 AND value =5498 ) GROUP BY product_id HAVING COUNT(*) = 3;
+----+-------------+-----------------------+-------+---------------+-------------+---------+------+------+----------------------------------------------+
| id | select_type | table                 | type  | possible_keys | key         | key_len | ref  | rows | Extra                                        |
+----+-------------+-----------------------+-------+---------------+-------------+---------+------+------+----------------------------------------------+
|  1 | SIMPLE      | product_property_test | range | property_id   | property_id | 8       | NULL |  124 | Using where; Using temporary; Using filesort |
+----+-------------+-----------------------+-------+---------------+-------------+---------+------+------+----------------------------------------------+
1 row in set (0.00 sec)
</pre>
<p>So it&#8217;s finding 124 instances of one of the property/value combinations. It needs to create a temp table and do a filesort for the group by and having. Now if that value was a lot bigger, like > 10000, things would start to slow down. Also if you would filter on a large number of properties, the temp table will grow.</p>
<p>Remember that there are a lot of different properties, so one of these properties is only used in a small subset of the product. If let&#8217;s say > 5% of the products has a specific property, we should just add a column to the product table.</p>
<p>Now in reality you&#8217;d probably not just search using the properties, but filter on fields from the product table as well. This should also limit the number of matching property/value pairs found.</p>
<pre>
SELECT product.* FROM product INNER JOIN product_property_test q ON product.id = q.product_id WHERE product.category_id = 200 AND ( ( property_id =65854 AND value =5493 ) OR ( property_id =65854 AND value =5491 ) OR ( property_id =65863 AND value =5498 ) ) GROUP BY product_id HAVING COUNT(*) = 3
</pre>
<p>So in practise this will scale well up to a couple million products. If you have more than that you should look at a different solution, like combining Redis and MySQL.</p>
<p>@Jaimie, I hope your questions are hereby answered. I agree that this isn&#8217;t the right way to go for all occasions, but it&#8217;s definitely useful for the situation as described above. If you want to discuss this further, please come with practical examples of where, why and how problems will arise.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jaimie Sirovich</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-338147</link>
		<dc:creator>Jaimie Sirovich</dc:creator>
		<pubDate>Wed, 11 Jan 2012 15:43:08 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-338147</guid>
		<description>@Arnold,

I don&#039;t believe I was flaming (or even worked up), but you&#039;re still pretty far gone and incorrect.  You would probably do better by deconstructing those values into integers and throwing them into a fulltext index.  Just use boolean mode and do +100 +51 +600, etc.

The only thing that bothered me is that you&#039;re recommending people don&#039;t serialize things in a database like it was the word of God and he thinks EAV is better.  It&#039;s really not, and EAV indexes are barely indexes in the traditional sense.  You&#039;re wasting your time esp. if you don&#039;t need an index.

You could use Sphinx if you consider that a storage engine, or you could take the FF approach http://backchannel.org/blog/friendfeed-schemaless-mysql

&lt;em&gt;What you&#039;re doing will not scale for faceted search.&lt;/em&gt;  Stop recommending it to people :)</description>
		<content:encoded><![CDATA[<p>@Arnold,</p>
<p>I don&#8217;t believe I was flaming (or even worked up), but you&#8217;re still pretty far gone and incorrect.  You would probably do better by deconstructing those values into integers and throwing them into a fulltext index.  Just use boolean mode and do +100 +51 +600, etc.</p>
<p>The only thing that bothered me is that you&#8217;re recommending people don&#8217;t serialize things in a database like it was the word of God and he thinks EAV is better.  It&#8217;s really not, and EAV indexes are barely indexes in the traditional sense.  You&#8217;re wasting your time esp. if you don&#8217;t need an index.</p>
<p>You could use Sphinx if you consider that a storage engine, or you could take the FF approach <a href="http://backchannel.org/blog/friendfeed-schemaless-mysql" rel="nofollow">http://backchannel.org/blog/friendfeed-schemaless-mysql</a></p>
<p><em>What you&#8217;re doing will not scale for faceted search.</em>  Stop recommending it to people <img src='http://www.jasny.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Arnold Daniels</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-338146</link>
		<dc:creator>Arnold Daniels</dc:creator>
		<pubDate>Wed, 11 Jan 2012 01:15:03 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-338146</guid>
		<description>@Jamie

First of all, I don&#039;t understand why you&#039;re all worked up and flaming on a year old article, but I&#039;ll respond anyway.

The problem space is the following. Let&#039;s say we&#039;re a hardware warehouse. We have a lot of different  products. They have some common properties like a price, but most properties that are specific to that type of hardware. For example a drill has different properties as a door, which is again different from a can of paint.

Let&#039;s say there are 1000 different kind of products, each product has got about 20 properties, which are not all unique. Still there might be something like 10.000 different properties. Creating a table with 10.000 columns is not feasible, not even it they&#039;re virtual.

If we just needed to store and display those properties, just serializing them would be a good solution. But in our case we want to filter on these properties.

If this is the main part of your project and you have the opportunity to move to a document-oriented DB, I would strongly suggest you do so. However, if this is only a small part of your project, moving everything into a doc DB, might just not be worth it. RDBMSs do have some signification advantages.

So, please take this as a given fact. We need to use an RDBMS and we need to store and filter those 10.000 different kind of properties.

A lot of people will just create a table with a varchar property field and a varchar value field. While it might work, that will indeed be very slow. Another common way is to create a table or field per type, but this also has mayor drawbacks as discussed above.

I&#039;m giving a solution where we cast any worth filtering down to an integer. So the idea is basically Java vs C. In Java a variable knows it&#039;s type, while in C a byte is just 8 bits and the meaning of those 8 bits can only be seen in context of the code. The same thing here, whether the integer represents a date, a decimal or a number, can only be seen in context of the code.

So I agree that we&#039;re abusing instead of using MySQL here. This is a very usable and relatively fast solution though. Much more that the other RDBMS alternatives.

I hope this answers your question and leaves you satisfied :)</description>
		<content:encoded><![CDATA[<p>@Jamie</p>
<p>First of all, I don&#8217;t understand why you&#8217;re all worked up and flaming on a year old article, but I&#8217;ll respond anyway.</p>
<p>The problem space is the following. Let&#8217;s say we&#8217;re a hardware warehouse. We have a lot of different  products. They have some common properties like a price, but most properties that are specific to that type of hardware. For example a drill has different properties as a door, which is again different from a can of paint.</p>
<p>Let&#8217;s say there are 1000 different kind of products, each product has got about 20 properties, which are not all unique. Still there might be something like 10.000 different properties. Creating a table with 10.000 columns is not feasible, not even it they&#8217;re virtual.</p>
<p>If we just needed to store and display those properties, just serializing them would be a good solution. But in our case we want to filter on these properties.</p>
<p>If this is the main part of your project and you have the opportunity to move to a document-oriented DB, I would strongly suggest you do so. However, if this is only a small part of your project, moving everything into a doc DB, might just not be worth it. RDBMSs do have some signification advantages.</p>
<p>So, please take this as a given fact. We need to use an RDBMS and we need to store and filter those 10.000 different kind of properties.</p>
<p>A lot of people will just create a table with a varchar property field and a varchar value field. While it might work, that will indeed be very slow. Another common way is to create a table or field per type, but this also has mayor drawbacks as discussed above.</p>
<p>I&#8217;m giving a solution where we cast any worth filtering down to an integer. So the idea is basically Java vs C. In Java a variable knows it&#8217;s type, while in C a byte is just 8 bits and the meaning of those 8 bits can only be seen in context of the code. The same thing here, whether the integer represents a date, a decimal or a number, can only be seen in context of the code.</p>
<p>So I agree that we&#8217;re abusing instead of using MySQL here. This is a very usable and relatively fast solution though. Much more that the other RDBMS alternatives.</p>
<p>I hope this answers your question and leaves you satisfied <img src='http://www.jasny.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jaimie Sirovich</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-338145</link>
		<dc:creator>Jaimie Sirovich</dc:creator>
		<pubDate>Tue, 10 Jan 2012 01:27:19 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-338145</guid>
		<description>@Arnold, Oleg

I don&#039;t get your logic.  Don&#039;t use serialized fields because they&#039;re an anti-pattern, but EAV is OK because it&#039;s quasi-normalized ... but STILL an anti-pattern.

That logic is flawed.  If you don&#039;t need an index, and you&#039;re not terribly interested in atomicity and/or can update the data in place using functions within a lock, it&#039;s just dandy.  If you embed JSON manipulation functions inside a RDBMS you&#039;re fine.  Same for CSV.  I do it all the time.  It&#039;s fine.

In fact, MariaDB has VIRTUAL COLUMNS that are based in a serialized BLOB approach with options to pull it out to a column if you want it indexed.  If not, it&#039;s left as a blob.

Why does the concept of normalization/atomicity change when you go to MongoDB.  MongoDB just supports only one table and uses an imperative language instead of a declarative one.  Nothing changes.  Using MongoDB doesn&#039;t suddenly make not making values atomic correct.  The question is whether you care.  There are no Gods who will smite you.  Just make sure you know what you&#039;re doing.

If you think otherwise, you&#039;re just plain wrong.

EAV is an awful idea invented by people that have no idea what Codd meant.  It&#039;s stupid slow and won&#039;t scale.</description>
		<content:encoded><![CDATA[<p>@Arnold, Oleg</p>
<p>I don&#8217;t get your logic.  Don&#8217;t use serialized fields because they&#8217;re an anti-pattern, but EAV is OK because it&#8217;s quasi-normalized &#8230; but STILL an anti-pattern.</p>
<p>That logic is flawed.  If you don&#8217;t need an index, and you&#8217;re not terribly interested in atomicity and/or can update the data in place using functions within a lock, it&#8217;s just dandy.  If you embed JSON manipulation functions inside a RDBMS you&#8217;re fine.  Same for CSV.  I do it all the time.  It&#8217;s fine.</p>
<p>In fact, MariaDB has VIRTUAL COLUMNS that are based in a serialized BLOB approach with options to pull it out to a column if you want it indexed.  If not, it&#8217;s left as a blob.</p>
<p>Why does the concept of normalization/atomicity change when you go to MongoDB.  MongoDB just supports only one table and uses an imperative language instead of a declarative one.  Nothing changes.  Using MongoDB doesn&#8217;t suddenly make not making values atomic correct.  The question is whether you care.  There are no Gods who will smite you.  Just make sure you know what you&#8217;re doing.</p>
<p>If you think otherwise, you&#8217;re just plain wrong.</p>
<p>EAV is an awful idea invented by people that have no idea what Codd meant.  It&#8217;s stupid slow and won&#8217;t scale.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: top mistakes</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-338131</link>
		<dc:creator>top mistakes</dc:creator>
		<pubDate>Fri, 09 Dec 2011 08:47:03 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-338131</guid>
		<description>Your site is really cool to me and your topics are very relevant.  I was browsing around and came across something you might find interesting.  I was guilty of 3 of them with my sites.  &quot;99% of site owners are guilty of these five mistakes&quot;.  http://tinyurl.com/cwa3tj7 You will be suprised how simple they are to fix.</description>
		<content:encoded><![CDATA[<p>Your site is really cool to me and your topics are very relevant.  I was browsing around and came across something you might find interesting.  I was guilty of 3 of them with my sites.  &#8220;99% of site owners are guilty of these five mistakes&#8221;.  <a href="http://tinyurl.com/cwa3tj7" rel="nofollow">http://tinyurl.com/cwa3tj7</a> You will be suprised how simple they are to fix.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Arnold Daniels</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-314846</link>
		<dc:creator>Arnold Daniels</dc:creator>
		<pubDate>Sun, 21 Nov 2010 14:47:00 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-314846</guid>
		<description>Yes, this is because the whole of Redis works like an index. My DBs are a couple hundred MBs max, so this isn&#039;t a problem for me. For logging solutions I never use redis.

Even if you have a lot of data and little memory, loading everything isn&#039;t necessarily a bad thing. Your server will simply store the least used data in swap space. Which is okay if that data is hardly used.

Make sure you read the FAQ. It has a lot of info about this: http://code.google.com/p/redis/wiki/FAQ</description>
		<content:encoded><![CDATA[<p>Yes, this is because the whole of Redis works like an index. My DBs are a couple hundred MBs max, so this isn&#8217;t a problem for me. For logging solutions I never use redis.</p>
<p>Even if you have a lot of data and little memory, loading everything isn&#8217;t necessarily a bad thing. Your server will simply store the least used data in swap space. Which is okay if that data is hardly used.</p>
<p>Make sure you read the FAQ. It has a lot of info about this: <a href="http://code.google.com/p/redis/wiki/FAQ" rel="nofollow">http://code.google.com/p/redis/wiki/FAQ</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Oleg</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-314818</link>
		<dc:creator>Oleg</dc:creator>
		<pubDate>Sun, 21 Nov 2010 13:39:18 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-314818</guid>
		<description>But it looks like Redis can be used only when all data can be in RAM, right?</description>
		<content:encoded><![CDATA[<p>But it looks like Redis can be used only when all data can be in RAM, right?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Arnold Daniels</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-312268</link>
		<dc:creator>Arnold Daniels</dc:creator>
		<pubDate>Wed, 17 Nov 2010 13:36:56 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-312268</guid>
		<description>&lt;b&gt;&lt;em&gt;Oleg&lt;/em&gt;&lt;/b&gt; Yes, see my previous comment.

I don&#039;t really like CouchDB. It&#039;s to abstract, so you end up writing a lot of code just getting the data from the DB. MongoDB is good for logging type of databases. In general I like Redis best for general purpose solutions http://code.google.com/p/redis/. The project doesn&#039;t have as nice a site as Mongo or Couch, but the software is great ;).</description>
		<content:encoded><![CDATA[<p><b><em>Oleg</em></b> Yes, see my previous comment.</p>
<p>I don&#8217;t really like CouchDB. It&#8217;s to abstract, so you end up writing a lot of code just getting the data from the DB. MongoDB is good for logging type of databases. In general I like Redis best for general purpose solutions <a href="http://code.google.com/p/redis/" rel="nofollow">http://code.google.com/p/redis/</a>. The project doesn&#8217;t have as nice a site as Mongo or Couch, but the software is great <img src='http://www.jasny.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Oleg</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-312228</link>
		<dc:creator>Oleg</dc:creator>
		<pubDate>Wed, 17 Nov 2010 12:23:00 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-312228</guid>
		<description>Hi, Arnold.
Did you look at document-oriented databases like MongDb and CouchDb as an alternative of EAV?
These products allow storing any number of attributes in the documents.
Do you think such database could be useful in many cases or they&#039;re still spefic products?
Best regards, Oleg.</description>
		<content:encoded><![CDATA[<p>Hi, Arnold.<br />
Did you look at document-oriented databases like MongDb and CouchDb as an alternative of EAV?<br />
These products allow storing any number of attributes in the documents.<br />
Do you think such database could be useful in many cases or they&#8217;re still spefic products?<br />
Best regards, Oleg.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Oleg</title>
		<link>http://www.jasny.net/articles/an-alternative-way-of-eav-modeling/comment-page-1/#comment-310983</link>
		<dc:creator>Oleg</dc:creator>
		<pubDate>Mon, 15 Nov 2010 17:48:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.adaniels.nl/?p=88#comment-310983</guid>
		<description>Yes,  serialized LOB seems violate even 1NF.
I don&#039;t know why it&#039;s recommended as an alternative to EAV.

Most data is store in a usual relational scheme, EAV is going to be used only for custom defined attributes of the subscribers.


Some suguest using fixed table pattern.
http://blog.springsource.com/arjen/archives/2008/01/24/storing-custom-fields-in-the-database/
It looks like we&#039;ll need up to 30 custom fields attributes and using fixed table pattern will require to many indexes per table I suppose.</description>
		<content:encoded><![CDATA[<p>Yes,  serialized LOB seems violate even 1NF.<br />
I don&#8217;t know why it&#8217;s recommended as an alternative to EAV.</p>
<p>Most data is store in a usual relational scheme, EAV is going to be used only for custom defined attributes of the subscribers.</p>
<p>Some suguest using fixed table pattern.<br />
<a href="http://blog.springsource.com/arjen/archives/2008/01/24/storing-custom-fields-in-the-database/" rel="nofollow">http://blog.springsource.com/arjen/archives/2008/01/24/storing-custom-fields-in-the-database/</a><br />
It looks like we&#8217;ll need up to 30 custom fields attributes and using fixed table pattern will require to many indexes per table I suppose.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
