<br><br><div class="gmail_quote">2009/7/8 Eden Cardim <span dir="ltr">&lt;<a href="mailto:edencardim@gmail.com">edencardim@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

2009/7/8  &lt;<a href="mailto:claudio@dpreferencial.com.br">claudio@dpreferencial.com.br</a>&gt;:<br>
<div class="im">&gt; Eu trabalho com processamento de pesquisas de mercado. (tabulação)<br>
&gt;<br>
&gt; No começo trabalhei muito anos com Statiscs SPSS, Statiscs ... (com estes<br>
&gt; programas as bases ficavam realmente gigantes..rsrs..200.000 campos..rsrs)<br>
&gt; acabei desenvolvendo meu próprio sistema de tabulação.<br>
</div><div class="im">&gt; levando em consideração que:<br>
&gt; - 80% dos campos de uma pesquisa são campos numéricos e RM (respostas<br>
&gt; múltiplas=campos multivalorados)<br>
&gt;   Ex:<br>
&gt;   Quais frutas vc gosta:<br>
&gt;   1 - abacaxi<br>
&gt;   2 - Mamão<br>
&gt;   3 - abacate....  até o código 50.<br>
&gt;<br>
&gt;   um fulano responde os códigos 2/3/4/9/10/15<br>
&gt;<br>
&gt;   num buffer(array de boleanos) eu marco true nestas posição e gravo.<br>
&gt;<br>
&gt; Veja, no SPSS ou em outras bases &quot;normais&quot; eu precisaria de 15 campos para<br>
&gt; guardar as informações,<br>
&gt; quando que eu guardo num campo só..de tamanho bem pequeno...rsrs..<br>
<br>
</div>Bom, até aqui, não vejo porque numa base relacional você precisaria de<br>
15 campos, se tivesse um modelo adequado ao seu problema como esse, em<br>
PostgreSQL:<br>
<br>
CREATE SEQUENCE person_no_seq INCREMENT BY 1 START WITH 1;<br>
CREATE SEQUENCE question_no_seq INCREMENT BY 1 START WITH 1;<br>
CREATE SEQUENCE field_no_seq INCREMENT BY 1 START WITH 1;<br>
<br>
CREATE TABLE person ( id INTEGER DEFAULT nextval(&#39;person_no_seq&#39;)<br>
PRIMARY KEY, name TEXT NOT NULL);<br>
CREATE TABLE question ( id INTEGER DEFAULT nextval(&#39;question_no_seq&#39;)<br>
PRIMARY KEY, query TEXT NOT NULL);<br>
CREATE TABLE field ( id INTEGER DEFAULT nextval(&#39;field_no_seq&#39;)<br>
PRIMARY KEY, name TEXT NOT NULL);<br>
CREATE TABLE answer ( question_id INTEGER REFERENCES question(id),<br>
field_id INTEGER REFERENCES field(id), person_id INTEGER REFERENCES<br>
person(id), UNIQUE(question_id, field_id, person_id) );<br>
<br>
INSERT INTO answer (question_id, field_id, person_id) VALUES ((SELECT<br>
id FROM question WHERE query = &#39;Qual a fruta que você mais gosta?&#39;),<br>
(SELECT id FROM field WHERE name = &#39;&#39;), (SELECT id FROM person WHERE<br>
name = &#39;Solli&#39;));<br>
INSERT INTO answer (question_id, field_id, person_id) VALUES ((SELECT<br>
id FROM question WHERE query = &#39;Qual a fruta que você mais gosta?&#39;),<br>
(SELECT id FROM field WHERE name = &#39;Abacaxi&#39;), (SELECT id FROM person<br>
WHERE name = &#39;Solli&#39;));<br>
INSERT INTO answer (question_id, field_id, person_id) VALUES ((SELECT<br>
id FROM question WHERE query = &#39;Qual a fruta que você mais gosta?&#39;),<br>
(SELECT id FROM field WHERE name = &#39;Uva&#39;), (SELECT id FROM person<br>
WHERE name = &#39;Solli&#39;));<br>
INSERT INTO answer (question_id, field_id, person_id) VALUES ((SELECT<br>
id FROM question WHERE query = &#39;Qual a fruta que você mais gosta?&#39;),<br>
(SELECT id FROM field WHERE name = &#39;Mamão&#39;), (SELECT id FROM person<br>
WHERE name = &#39;Wesley&#39;));<br>
INSERT INTO answer (question_id, field_id, person_id) VALUES ((SELECT<br>
id FROM question WHERE query = &#39;Qual a fruta que você mais gosta?&#39;),<br>
(SELECT id FROM field WHERE name = &#39;Uva&#39;), (SELECT id FROM person<br>
WHERE name = &#39;Wesley&#39;));<br>
<br>
A partir daqui você pode fazer várias consultas:<br>
<br>
Por exemplo, tendo o nome da pessoa descobrir quais frutas ela gosta:<br>
<br>
SELECT <a href="http://f.name" target="_blank">f.name</a> FROM field f JOIN answer a ON a.field_id = <a href="http://f.id" target="_blank">f.id</a> JOIN<br>
question q ON a.question_id = <a href="http://q.id" target="_blank">q.id</a> JOIN person p on a.person_id = <a href="http://p.id" target="_blank">p.id</a><br>
WHERE <a href="http://p.name" target="_blank">p.name</a> = &#39;Wesley&#39; AND q.query = &#39;Qual a fruta que você mais<br>
gosta?&#39;;<br>
SELECT <a href="http://f.name" target="_blank">f.name</a> FROM field f JOIN answer a ON a.field_id = <a href="http://f.id" target="_blank">f.id</a> JOIN<br>
question q ON a.question_id = <a href="http://q.id" target="_blank">q.id</a> JOIN person p on a.person_id = <a href="http://p.id" target="_blank">p.id</a><br>
WHERE <a href="http://p.name" target="_blank">p.name</a> = &#39;Solli&#39; AND q.query = &#39;Qual a fruta que você mais<br>
gosta?&#39;;<br>
SELECT <a href="http://f.name" target="_blank">f.name</a> FROM field f JOIN answer a ON a.field_id = <a href="http://f.id" target="_blank">f.id</a> JOIN<br>
question q ON a.question_id = <a href="http://q.id" target="_blank">q.id</a> JOIN person p on a.person_id = <a href="http://p.id" target="_blank">p.id</a><br>
WHERE <a href="http://p.name" target="_blank">p.name</a> = &#39;Mantovani&#39; AND q.query = &#39;Qual a fruta que você mais<br>
gosta?&#39;;<br>
<br>
E tem um &quot;macete&quot; para &quot;tabular&quot; campos inseridos na tabela &quot;field&quot;,<br>
você faz uma pré-consulta:<br>
<br>
SELECT <a href="http://f.name" target="_blank">f.name</a> FROM field f JOIN answer a ON a.field_id = <a href="http://f.id" target="_blank">f.id</a> JOIN<br>
question q ON a.question_id = <a href="http://q.id" target="_blank">q.id</a> WHERE q.query = &#39;Qual a fruta que<br>
você mais gosta?&#39; GROUP BY <a href="http://f.name" target="_blank">f.name</a>;<br>
<br>
Depois usa os valores de retorno para construir outra consulta:<br>
<br>
SELECT <a href="http://p.name" target="_blank">p.name</a>,<br>
  SUM((SELECT CASE WHEN <a href="http://f.name" target="_blank">f.name</a> = &#39;Mamão&#39; THEN 1 ELSE 0 END)) AS Mamão,<br>
  SUM((SELECT CASE WHEN <a href="http://f.name" target="_blank">f.name</a> = &#39;Abacate&#39; THEN 1 ELSE 0 END)) AS Abacate,<br>
  SUM((SELECT CASE WHEN <a href="http://f.name" target="_blank">f.name</a> = &#39;Abacaxi&#39; THEN 1 ELSE 0 END)) AS Abacaxi,<br>
  SUM((SELECT CASE WHEN <a href="http://f.name" target="_blank">f.name</a> = &#39;Maçã&#39; THEN 1 ELSE 0 END)) AS Maçã,<br>
  SUM((SELECT CASE WHEN <a href="http://f.name" target="_blank">f.name</a> = &#39;Uva&#39; THEN 1 ELSE 0 END)) AS Uva<br>
FROM field f JOIN answer a ON a.field_id = <a href="http://f.id" target="_blank">f.id</a> JOIN person p ON<br>
a.person_id = <a href="http://p.id" target="_blank">p.id</a><br>
GROUP BY <a href="http://p.name" target="_blank">p.name</a>;<br>
   name    | mamão | abacate | abacaxi | maçã | uva<br>
-----------+-------+---------+---------+------+-----<br>
 Wesley    |     1 |       0 |       0 |    0 |   1<br>
 Solli     |     1 |       0 |       1 |    0 |   0<br>
 Mantovani |     1 |       0 |       0 |    0 |   0<br>
<br>
Claro que o modelo pode ser mais preciso e elaborado, mantive simples<br>
apenas para facilitar a ilustração. As demais consultas ficam como<br>
exercício para o leitor... ;)<br>
<div class="im"><br>
&gt; Desenvolvi um formato para o meu arquivo de dados,<br>
&gt; levando em consideração minhas necessidades, tais como:<br>
&gt;<br>
&gt; - conteúdo criptografado.<br>
<br>
</div>Se for criptografia da boa, você vai sofrer muito com o desempenho, e<br>
se for da criptografia ruim (xor, etc.), não vale a pena usar.<br>
Geralmente, só se criptografam dados que trafegam em locais públicos e<br>
mesmo assim, segurança é trabalho pro SO e não pro banco de dados.<br>
<div class="im"><br>
&gt; - tamanho final do arquivo de base.<br>
<br>
</div>Economizar espaço vai fazer você gastar processamento, para<br>
&quot;empacotar&quot; e &quot;desempacotar&quot; os dados. Geralmente é preferível<br>
economizar no processamento porque espaço sempre escala, mas<br>
processamento não.</blockquote><div><br><span style="font-family: courier new,monospace;">... certamente storage é mais escalável do que processador, mas as operações de join e agrupamento de banco de dados também tem consumo de cpu considerável. Sei do teu &#39;fetiche&#39; por banco de dados, mas colocar tudo dentro de um banco de dados não é garantia de desempenho (mas gostei da tua abordagem) .... </span><br>

</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<div class="im"><br>
&gt; - quantidade final de campos na base.<br>
&gt; - base não normalizada = campos multivalorados e dependentes..<br>
&gt; - conteúdo dos campos: numérico.<br>
<br>
</div>Irrelevante com um modelo relacional adequado.<br>
<br>
Além disso, com uma base de dados relacional de verdade você vai obter<br>
vantagens como garantia de integridade, controle de concorrência,<br>
índices, etc, etc.<br>
<br>
Talvez eu não esteja enxergando direito, mas não vejo necessidade de<br>
se implementar um sistema de armazenamento próprio com os requisitos<br>
que você postou aqui a não ser por motivos educacionais.<br>
<font color="#888888"><br>
--<br>
</font><div class="im">   Eden Cardim       Need help with your Catalyst or DBIx::Class project?<br>
  Code Monkey                    <a href="http://www.shadowcat.co.uk/catalyst/" target="_blank">http://www.shadowcat.co.uk/catalyst/</a><br>
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?<br>
<a href="http://edenc.vox.com/" target="_blank">http://edenc.vox.com/</a>            <a href="http://www.shadowcat.co.uk/servers/" target="_blank">http://www.shadowcat.co.uk/servers/</a><br>
_______________________________________________<br>
</div><div><div></div><div class="h5">SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa<br>