Jump to content
Sign in to follow this  
skiller10

Relacionamento de tabelas

Recommended Posts

skiller10

Boas,

Eu estive a pensar na organização de uma base de dados e as relações entre tabelas e não consegui chegar a uma conclusão que a meu ver pareça fiável.

Objectivo: Um utilizador ao efectuar login no site e visitar uma página com o título de notícias, que podem ser abertas, ser mostrada uma indicação se o mesmo já viu essa notícia anteriormente.

Alguém me consegue dar umas dicas sobre isto?


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

Dicas? Como assim?.

Dicas para criação da estrutura da BD?. Se é isso, então assim de repente, e com a informação que postaste tens que criar uma tabela para utilizadores, login, noticias.

Para a questão do utilizador já ter ou não lido a noticia, podes por exemplo adicionar um campo do tipo Sim/Não.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

Sim, dicas para a criação da estrutura da BD.

A tabela de utilizadores e de login não é a mesma?

Adiciono um campo do tipo Sim/Não à tabela de noticias, correcto?

Pelo que percebi devo utilizar uma relação de um para muitos, acho que é assim que se diz, em que tenho uma tabela de notícias para cada utilizador?

Se alguém me conseguisse arranjar um esquema que ilustrasse mais ou menos isto agradecia, porque não compreendo muito bem as relações entra tabelas.


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

... A tabela de utilizadores e de login não é a mesma?...

De acordo com a informação que aqui está, penso que sim, em vez de duas tabelas podes ter só uma onde fica a informação que te interessa guardar do utilizador, e as respectivas credênciais de login.

...Adiciono um campo do tipo Sim/Não à tabela de noticias, correcto?...

Assim de repente e sem mais informação, sim pode-se adicionar o campo á tabela de noticias.

...Pelo que percebi devo utilizar uma relação de um para muitos, acho que é assim que se diz, em que tenho uma tabela de notícias para cada utilizador?...

O raciocinio é algo deste género: Um utilizador pode ler várias noticias, mas uma noticia pode ser lida por vários utilizadores, logo entre Utilizadores e Noticias, vai ser uma relação do tipo n para m, ou seja, vários para vários. Vais ter que normalizar esta relação, transformando-a em duas do tipo 1 para n.

...Se alguém me conseguisse arranjar um esquema que ilustrasse mais ou menos isto agradecia, porque não compreendo muito bem as relações entra tabelas.

Passa a tua ideia para o papel, começa a dar uns "toques", e depois apresenta as dúvidas que forem surgindo.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

Obrigado, em papel já consegui chegar à solução  :cheesygrin:


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

:cheesygrin: Ok. Então mostra o que já fizeste relativamente á B.D

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

Cheguei a isto:

basedados.png


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

O que é a tabela visitas?

Para a tabela utilizadores e noticias, o raciocinio é o que já disse anteriormente:

(...) Um utilizador pode ler várias noticias, mas uma noticia pode ser lida por vários utilizadores, logo entre Utilizadores e Noticias, vai ser uma relação do tipo n para m, ou seja, vários para vários. Vais ter que normalizar esta relação, transformando-a em duas do tipo 1 para n. (...)

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

A tabela visitas basicamente iria registar quem já viu cada problema, por exemplo, se o UserX visitar o Problema1, adiciona um registo a tabela visitas com o Id do utilizador e o Id do problema.

No raciocínio que deste, não é necessária outra tabela?


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Bom dia.

Ah! Já estou a perceber é uma tabela de guests, pois os utilizadores de um site tanto podem ser registados como não. Não indo mais longe, é como por exemplo os utilizadores aqui do forum, tem-se os utilizadores registados, como os utilizadores não registados (visitantes) só com privilegios de leitura. Certo?

Então de visitantes para noticias, o racicionio vai ser semelhante ao do utilizadores para noticias.

De utilizador para visitas, é algo deste género: Um utilizador pode ser um visitante, tal como um visitante pode ser um utilizador, logo penso que vai ser uma relação de 1 para 1.

Vê se com isto consegues "melhorar" o esquema da B.D, pois acabou de ficar um pouco mais complexo.  :cheesygrin:

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
KTachyon

A tabela visitas é uma entidade fraca, não precisas de ter a chave primária nessa tabela (não serve para nada). De facto, o que compões, efectivamente a chave primária dessa tabela é o conjunto user+notícia (chaves estrangeiras, suponho), que significam o registo de que o utilizador visitou essa notícia e que, por questões de consistência, devem formar um par único nessa tabela (o par de chaves só deve aparecer uma única vez na 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
skiller10

Eu adicionei o campo Id para chave primária na tabela "Visitas" pois pensei que seria obrigatório definir uma chave primária.

O que significa chaves estrangeiras?

A minha ideia é exactamente essa. Já agora consegues-me explicar uma maneira eficiente que o par é único? Sei definir um campo com valores únicos, mas um par não sei.


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa tarde.

Chave estrangeira, é um conceito aplicado a uma tabela composta por duas chaves primárias de outras tabelas.

Como te disse anteriormente:

...Então de visitantes para noticias, o racicionio vai ser semelhante ao do utilizadores para noticias...

Ou seja, como vai ser uma relação do tipo n para m, vais ter que criar uma terceira tabela por exemplo com o nome Visitas/Noticias, composta pelas chaves primárias de Visitas e Noticias.

(...)uma maneira eficiente que o par é único? Sei definir um campo com valores únicos, mas um par não sei.

Acho que não percebi, podes explicar melhor?

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
KTachyon

Não és obrigado a definir uma chave primária. Mas podes definir uma chave primária que consiste em duas colunas de uma tabela. A chave primária é uma determinada informação que identifica unicamente um registo na tabela. No caso da tabela visitas, se queres mesmo considerar uma chave primária, então esta será o conjunto user+notícia (chave primária composta). Se criares este constraint podes garantir que o par é sempre único. Outra forma é fazeres mesmo a pesquisa:

SELECT COUNT(*) FROM Visitas WHERE user = <id_do_user> AND noticia = <id_da_noticia>;

Chave estrangeira (foreign key) é uma entrada numa tabela que corresponde a um ID de outra tabela. No caso da tua tabela de visitas, o teu "user" deverá ser o ID do utilizador, e o teu "noticia" será o ID na tabela de notícias, ambas chaves estrangeiras.

Chave primária composta:

CREATE TABLE visitas(
  user INTEGER,
  noticia INTEGER,
  PRIMARY KEY (user, noticia)
);


“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
skiller10

Obrigado KTachyon, acho que percebi bem a ideia.

progster, não percebi bem o que querias dizer. A tabela visitas só irá 'funcionar' se a pessoa estiver logada, se não estiver logada todas as notícias iram aparecer como não lidar, se a pessoa estiver logada, irá ser feita uma pesquisa na tabela visitas e colocar o link a preto de todas as notícias que o mesmo já visitou. Quando a pessoa, que esteja logada, entra numa notícia que ainda não tenha lido, será adicionada um registo à tabela "Visitas" com o seu id e o id da notícia.


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa tarde.

Aquilo que eu disse relativamente á chave estrangeira, foi a mesma coisa que o @KTachyon disse, só que ele disse-o de uma maneira mais completa.  :cheesygrin:

Então se a tabela visitas irá funcionar com esse proposito para que serve a tabela utilizadores?

Aquilo que disse relativamente

...Então de visitantes para noticias, o racicionio vai ser semelhante ao do utilizadores para noticias...

Estava-me a querer referir ao tipo de relação entre tabelas.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

A tabela "Utilizadores" irá conter os dados de login de cada pessoa.


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

Correndo o risco de estar errado, acho que deverias rever o funcionamento interno que queres dar á BD.

Não deveria ser algo deste género?:

…Não indo mais longe, é como por exemplo os utilizadores aqui do forum, tem-se tanto os utilizadores registados, como os utilizadores não registados (visitantes) só com privilegios de leitura…

Uma tabela Login, onde que vai guardar as credenciais de cada utilizador registado;

Se o utilizador não quiser participar no fórum, mas quiser ler os tópicos, não faz o login, ficando como visitante (Tabela Visitas), sendo-lhe atribuído por exemplo um Id de Guest;

Se o utilizador quiser participar, ou seja, se quiser ter privilégios de leitura e escrita, faz o login (Tabela Utilizadores);

Se o utilizador não “logado” (visitante – Tabela Visitas -) quiser ler uma noticia, dentro da mesma tabela deveria estar um campo com por exemplo o nome da noticia, e outro campo por exemplo do tipo Sim/Não, significando isto por exemplo que o utilizador com o Id “guest001” leu a noticia com o nome “xxxx”

Se o utilizador “logado” (– Tabela Utilizadores -) quiser ler uma noticia, dentro da mesma tabela deveria estar um campo com por exemplo o nome da noticia, e outro campo por exemplo do tipo Sim/Não, significando isto por exemplo que o utilizador com o Id “aaaa” leu a noticia com o nome “xxxx”

Tanto para a tabela Utilizadores, como Visitas, se o campo do tipo Sim/Não, estiver preenchido, então os correspondentes leram a noticia, se não estiver preenchido é porque ainda não leram a noticia.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
KTachyon

Aquilo que eu disse relativamente á chave estrangeira, foi a mesma coisa que o @KTachyon disse, só que ele disse-o de uma maneira mais completa.  :cheesygrin:

Pois, eu já tinha escrito aquilo e achei mal empregado não postar depois de ter visto que já tinha sido postada uma nova mensagem :cheesygrin:


“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
skiller10

Já percebi a tua ideia, só não tenho a certeza de como fazer o seguinte: inicialmente existem 20 noticias, por exemplo, ou seja 20 campos sim/nao, se for adicionada uma notícia, tem que ser adicionada um novo campo à tabela de utilizadores, certo?


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

Não, não precisas de adicionar sempre um campo novo quando é "introduzida" uma nova noticia.

A mesma é adicionada á tabela noticias.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

Há algum pormenor que me está a falhar e não estou a conseguir entender bem. Consegues-me fazer um esquema?


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Share this post


Link to post
Share on other sites
progster

Boa noite.

(...) Consegues-me fazer um esquema?

Já aqui tens informação mais do que suficiente para criares um segundo, pois o primeiro já o apresentaste, modelo entidade relações.

Passa o novo esquema para o papel, e depois caso surgam, apresenta dúvidas.

Cumprimentos.


Não resolvo dúvidas por PM.

Share this post


Link to post
Share on other sites
skiller10

Boa noite,

No meu caso não me interessa guardar qualquer registo sobre quem não está logado.

O esquema que eu tenho neste momento é o seguinte:

basedados.png

A única dúvida que tenho de momento e foi a razão pela qual pedi um esquema foi porque não percebi o funcionamento desta ideia:

Se o utilizador “logado” (– Tabela Utilizadores -) quiser ler uma noticia, dentro da mesma tabela deveria estar um campo com por exemplo o nome da noticia, e outro campo por exemplo do tipo Sim/Não, significando isto por exemplo que o utilizador com o Id “aaaa” leu a noticia com o nome “xxxx”

Tanto para a tabela Utilizadores, como Visitas, se o campo do tipo Sim/Não, estiver preenchido, então os correspondentes leram a noticia, se não estiver preenchido é porque ainda não leram a noticia.


"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

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
Sign in to follow this  

×
×
  • 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.