Jump to content
nunopicado

Duvida Estrutural - Tabela com campos dinâmicos

Recommended Posts

nunopicado

Boas

Preciso de fazer uma tabela (ou mais se for necessário) para guardar os dados de licenciamento de diverso software.

A questão é que cada software, que será inserido pelo utilizador final, tem tipos diferentes de dados de licenciamento, ou seja, o utilizador, além de meter o nome do software e alguma informação comum a todos (por exemplo, a data de venda), deverá inserir quais os campos especificos desse software. Só depois poderá então guardar os dados propriamente ditos.

A minha questão é como estruturar a tabela. A minha ideia inicial era ter duas tabelas:

Uma guardaria os tipos de software, e os campos que cada um precisaria (estava a pensar um campo varchar com os Nomes dos campos especificos, tipo Campos = "Chave;Código de Activação;Código de Cliente").

A outra tabela guardaria as licenças propriamente ditas, ou seja, um campo seria o ID do software (da primeira tabela), os campos comuns (ex.: Data) e depois alguns campos genéricos, onde se guardaria a informação pela ordem dos nomes dos campos na primeira tabela.

No entanto isto parece-me tudo menos fiável...

Alguém tem uma ideia para fazer isto como deve ser?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
kareka

Os dados de licenciamento variam de que forma?


<?php include("assinatura.txt"); ?>

Share this post


Link to post
Share on other sites
nunopicado

Obrigado pela resposta...

Imagina este exemplo:

Para guardar os dados relativos ao windows, office, panda anti-virus, gestão de facturação, são necessários os seguintes campos:

WINDOWS

Data Venda, Canal de Revenda (OEM ou Retalho), Chave

OFFICE

Data Venda, Canal de Revenda (OEM ou Retalho), Chave

PANDA

Data Venda, Username, Password, Código de Activação, Código de Cliente, Nº de Licenças, Duração da Licença

FACTURAÇÃO

Data Venda, Descrição, Nº Série, Chave, Nº de Utilizadores, Chave Módulo Encomendas, Chave Módulo POS

Ou seja, a data de venda é comum a todo o software a guardar, mas a partir daí, tudo depende o software em questão.

Alguma ideia? ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
kareka

Para cada Windows, guardas mais que um produto? Os dados relativos a todos os Windows são todos iguais?

As mesma perguntas para o resto dos exemplos...


<?php include("assinatura.txt"); ?>

Share this post


Link to post
Share on other sites
nunopicado

A ideia é, se um determinada variante de software usar tipos diferentes, conta como se fosse um software diferente. Aliás, a descrição do software deverá ser completa, com fabricante, nome principal e versão.

Por exemplo, o Panda a retalho usa os que mencionei em cima, mas o Panda MOP ainda leva mais um campo email e outro url, para a consola de administração.

Neste caso, haveria um software chamado Panda AV Pro (o normal) com os campos de cima, outro chamado Panda IS (com os mesmos campos) e outro chamado panda MOP, com todos aqueles mais o email e o url.

No caso do Windows, Office, etc é a mesma coisa... Tipo:

Windows 7 Pro - chave, canal

Windows 7 Home Premium - chave, canal

Windows Server 2008 Standard - chave, canal, nº utilizadores


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
kareka

Sugiro criar uma tabela de produtos com todas as informações em comum, certo?

De seguida, podias criar outra tabela referente aos dados mais específicos de cada software sendo estas ligadas por uma chave estrangeira.

SOFTWARE:

    Nome

    Data_venda

    ID_dados

    etc...

DADOS:

    Canal

    Chave

    etc...

É uma sugestão, não sei se é a mais correcta mas espero que ajude.


<?php include("assinatura.txt"); ?>

Share this post


Link to post
Share on other sites
FreiNando

Isso é possivel utilizando um campo BLOB onde podes colocar a restante informação por exemplo em XML

BLOB é o tipo de dados binarios onde podes colocar a informação que quiseres no formato que quizeres, ou até inserir ficheiros de qualquer tipo.

Como exemplo de um sotware que usa BLOBs indico-te o ArcGis onde a cada registo diz respeito a uma feature que por sua vez pode ser um um ponto, uma linha ou poligono com um numero variavel de pontos ou vertices.


O caminho mais curto para conseguir fazer muitas coisas é fazer uma de cada vez. Samuel Smiles

Share this post


Link to post
Share on other sites
nunopicado

Obrigado a ambos...

As chaves estrangeiras é um palavrão que já ouvi, mas nem sei o que são...

O MySQL é novo para mim, o mais complexo que já lhe fiz foram unions ( 😳)

O que fazem elas ao certo?

Quando ao BLOB, é uma ideia. Ainda não me tinha lembrado disso, até porque li algures que os BLOBS são mais dados a perdas de dados, pelo que não me ocorreu usar para coisas mais importantes. Mas vou espreitar a respeito!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
KTachyon

Uma chave estrangeira é uma chave que relaciona uma entidade a outra. No exemplo do kareka, a chave estrangeira ID_Dados permite estabelecer a relação de uma entrada da tabela Software a uma entrada na tabela de Dados, através do id da tabela Dados. Dito de outra forma, é uma referência para outra tabela.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
nunopicado

Então basicamente, é uma ligação permanente entre duas tabelas, é isso?

Eu costumo usarem tabelas um campo para o ID de outra, que depois relaciono na query por exemplo com uma inner join.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
KTachyon

Basicamente é isso, mas normalmente associam-se constraits para impedir que se apaguem entradas, deixando chaves estrangeiras com um id que deixou de existir, por exemplo.

A título de exemplo, imagina que tens uma tabela pessoa e uma outra tabela que vai ter uma chave estrangeira para a pessoa. Ao criares a tabela podes adicionar o seguinte constraint:

CONSTRAINT `fk_pessoa_id` FOREIGN KEY (`pessoa_id`) REFERENCES `Pessoa`

Isto ajuda a minimizar a perda de integridade dos dados, aplicando uma regra ao nível da base de dados. Se tentares apagar uma pessoa que esteja referenciada por uma entrada nesta tabela, não consegues, de forma a que não fiques com essa entrada com uma referência para dados que não existem, obrigando-te a apagar, primeiro a entrada com a referência para essa pessoa e só depois a pessoa.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
nunopicado

Isso é interessante... Tenho no mesmo programa duas tabelas, "terceiros" e "registos", e em registos tenho um campo terceiro_ID a referenciar o ID da primeira.

Para eliminar um terceiro, tenho sempre que testar se existe alguma entrada em registos, para impedir que hajam registos sem terceiro associado.

Isso poderia resolver a questão.

Diz-me, se souberes, estava aqui a ler e pelo que percebi, as Foreign Keys funcionam em InnoDB. Com tabelas MyIsam não funcionam? É que não estou a usar o MySql server, mas sim o Uniserver, uma versão reduzida do mysql, mas que não tem InnoDB.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
KTachyon

Por acaso não tenho nenhuma experiência com MyISAM, mas penso que a questão da implementação dos constraints das chaves estrangeiras em MyISAM já foi discutida há muitos anos e, pelo que percebi na altura, estavam para ser implementadas, eventualmente. Não faço ideia se tal sucedeu ou não.

Mas, só para clarificar, o teste tem sempre que ser feito. O sistema só impede a eliminação de registos referenciados noutra tabela, o que permite logo impedir qualquer tentativa de arruinar a integridade desses dados. A questão de apagar já será outra. Existem, de facto, "comandos" que permitem definir o que acontece quando um determinado registo referenciado é apagado. Podes dar uma espreitadela nos ON DELETE, que pode executar a acção CASCADE, que apaga os registos referenciados, por exemplo. O problema é que em bases de dados MySQL parece que o CASCADE não está completamente implementado. O CASCADE apenas apagava os registos com a referência, e em casos em que há vários níveis de referências (uma tabela que referencia outra tabela, que por sua vez referencia outra tabela, por aí em diante), o CASCADE aparenta só funcionar no nível directamente acima (abaixo? depende do ponto de vista).

As soluções, normalmente, são a verificação pela aplicação que utiliza a base de dados, ou mesmo a implementação de triggers que reajam desta forma.

Mas há duas filosofias, uma que diz que a aplicação deve tomar conta da integridade dos dados que insere/altera/remove, e outra que diz que cabe à base de dados fazê-lo. Na minha opinião há casos e casos. Em alguns casos acredito que seja mais fácil garantir a consistência dos dados pela aplicação, mas penso que a maioria das vezes, isso deve ser feito ao nível da base de dados e convenientemente testado antes de lançar o sistema para produção. Isto porque, se a base de dados garantir a consistência correctamente, é impossível que algum bug imprevisto na aplicação arruine a consistência dos dados, que em produção poderia ser um desastre. E é mais fácil corrigir um bug numa aplicação que recuperar a consistência dos dados de uma base de dados. (Aconselham-se backups, nevertheless ;))


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
nunopicado

:)

No such thing as too many backups... lol

Vou dar uma olhada a isto... ;)

Obrigado a todos!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

OK, obrigado! ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.