Hi.

I have a table of products, each product has one or more texts in a related
table. The related table does not only have the text stored, but also a
language column, i.e. the table stores texts in all languages. A product
can have more than one text in one language.

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `artnum` varchar(12) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `artnum_UNIQUE` (`artnum`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE `text` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_prod` int(11) DEFAULT NULL,
  `lang` varchar(2) DEFAULT NULL COMMENT 'ISO 639-1 code of language
used.\n',
  `text` text COMMENT 'The text describing the product itself.\n',
  PRIMARY KEY (`id`),
  KEY `fk_text_prod` (`id_prod`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


In an overview of products, I want to see how many texts each product _in_
_each_ _language_ has. How do I do this with DBIc?

I tried with prefetch, but don't understand how I can differentiate the
prefectched rows by language. Currently I just get the products, and then
iterate over each product, doing n searches, one for each language. At
currently 5 languages and 25 products per page, I have 125 queries just to
get at that information. The fetch time is notable, in the range of 2 or 3
seconds.

One idea I had is to give up some level of normalization, put a trigger in
table `text` which updates a per language counter in table `products`. But
I don't know if this isn't overkill just to get the counts of texts per
product per language.

Another idea was to have one table per language, resulting in a simple 1:n
relation for each language. But that would require extending the tables
when we add a new language. Possible, but not very elegant.

The `text` table does not update very often, in fact only rarely once it is
populated. So the number of texts per product do not change often.

Maybe the design of the database is just inefficient, it's not my main area
of expertise... :)

So my questions are:
- How do I do an effective search with or without prefetch for this related
table with dbic, just getting the counts per language in the related table?
- Is such a design useful at all, considered that this is just one of nine
similiar related tables?


TIA,
Ekki
_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk

Reply via email to