relazioni

stavo pensando :

ma a livello di progettazione del database ... come posso ''collegare'' fisicamente un campo di una tabella a quello di un'altra senza dover pensare prima alla query da scrivere (  :2funny: ) cioè

a stabilire le relazioni tra le tabelle.

ammettendo di avere due tabelle :

utenti

CREATE TABLE  `users` (
  `uid` int(10) unsigned NOT NULL auto_increment,
  `username` varchar(45) NOT NULL default '',
  `password` varchar(45) NOT NULL default '',
  `email` varchar(45) NOT NULL default '',
  `bid` varchar(45) NOT NULL default '1',
  `permission` enum('1','2','3') NOT NULL default '3',
  `avatar` varchar(255) NOT NULL default 'noavatar.png',
  `lastaction` int(11) unsigned NOT NULL default '0',
  `lid` int(10) unsigned NOT NULL default '2',
  `regdate` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`uid`)
) ENGINE=MyISAM;

bands

CREATE TABLE  `bands` (
  `bid` int(10) unsigned NOT NULL auto_increment,
  `regdate` int(11) unsigned NOT NULL default '0',
  `lastaction` int(11) unsigned NOT NULL default '0',
  `website` varchar(255) NOT NULL default '',
  `description` text NOT NULL,
  `contacts` int(10) unsigned NOT NULL default '0',
  `events` int(10) unsigned NOT NULL default '0',
  `name` varchar(80) NOT NULL default '',
  `place` int(10) unsigned NOT NULL default '0',
  `bandleader` int(10) unsigned NOT NULL default '0',
  `bom` enum('1','0','PASSED') NOT NULL default '0',
  `bomdate` int(11) unsigned NOT NULL default '0',
  `music` int(10) unsigned NOT NULL default '0',
  `style` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`bid`)
) ENGINE=MyISAM;

in questo caso la tabella users andrebbe collegata da un intero alla tabella bands :

user.bid = bands.bid

SELECT username, email, u.regdate, u.bid, b.bid AS bandid, u.uid, b.name, b.bandleader AS leader, u.avatar,
                  s.mailing, l.lid, l.lname, locs.pid , locs.name AS location, locs.state, t.tagid, t.tagname AS type, b.music, 
                  u.lastaction, ct.tagname AS childname, ct.tagid, ct.childid, b.style
                  FROM users AS u 
                    INNER JOIN levels AS l ON u.lid=l.lid 
                    INNER JOIN bands AS b ON u.bid=b.bid
                    INNER JOIN settings AS s ON uid=s.user 
                    INNER JOIN locations AS locs ON b.place=locs.pid
                    INNER JOIN tags AS t ON b.music=t.tagid
                    INNER JOIN childtags AS ct ON b.style=ct.childid
                           WHERE uid=1

e a sua volta la tabella bands andrebbe collegata con una tabella che contiene delle tag , che a sua volta contiene una tabella con sotto tag :D ( non mi è ancora chiaro come creare una categoria e una serie di categorie figlie )

in modo da collegare l'utente a quella band , come posso relazionare i campi?

posso relazionare più campi su ogni tabella in modo da avere uno schema di database che sia abbastanza leggibile senza per forza sapere quali sono i campi da relazionare con le query di tipo JOIN?

grazie :D

 :bye:

inviato 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

In pratica stai chiedendo "come si progetta un database?". La risposta non è univoca ma generalmente il promo passo è quello di realizzare il modello Entità-Relazione (ER). Si tratta di uno shema logico che permette di identificare le entità (Utenti, gruppi), i loro attributi (nome, cognome) e le relazioni che legano le diverse entità.

Creato questo modello si passa alla sua traduzione in modello relazionale, quello cioé costituito da tabelle. I "collegamenti" tra le tabelle derivano dalle relazioni definite nel modello ER.

L'SQL per interrogare il DB così creato è una diretta conseguenza della struttura del modello relazionale ottenuto.

Ovviamente questa descrizione non ha lo scopo di insegnarti nulla ma solo quello di farti capire che la tua domanda ha come (vera) risposta l'acquisto di un libro sulle basi di dati.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

lol

non sapevo dicesse quello hihihhi

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Gianni , lol , più o meno ho chiaro come collegare le entità con i rispettivi attributi ( o almeno lo spero :D ) solo che mi chiedevo se per ottenere lo stesso risultato delle query di tipo JOIN ci sarebbe un modo ''nativo'' di collegare le tabelle fra di loro

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Il collegamento tra le tabelle è di tipo semantico, ovvero è il significato ed il ruolo di ciascun campo ha creare il nesso tra le tabelle.

Le FOREIGN KEY (chiave esterna) non sono propriamente dei collegamenti tra tabelle ma dei vincoli di integrità. In pratica non realizzano un collegamento tra i dati delle tabelle (non è necessario!) ma vincolano il DB a rispettare i collegamenti semantici preesistenti. Le FOREIGN KEY non sono la legge ma i poliziotti.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

grazie :D

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Salve, gianni protesti fare un esempio che mi interessa anche a me come relazionare le mie due tabelle

utenti

tbl_corporazioni

le ho fatte da phpmyadmin con mysql 5 innodb.

Grazie.

saluti.

risposto 8 anni fa
lab82
X 0 X

ho trovato esempio ad questo post : http://www.phpnews.it/forum/index.php?topic=349.0

risposto 8 anni fa
lab82
X 0 X

ho provato anche io,

poi il db ora lo scritto in un file di testo ed importato ad phpmyadmin,

però quando lo dinuovo esportato perchè ed venuto cosi:

come mai?.

grazie.

-- phpMyAdmin SQL Dump

-- version 2.10.3deb1ubuntu0.1

-- http://www.phpmyadmin.net

-- 

-- Host: localhost

-- Generato il: 17 Gen, 2008 at 09:48 PM

-- Versione MySQL: 5.0.45

-- Versione PHP: 5.2.3-1ubuntu6.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

-- 

-- Database: `gdr`

-- 

-- --------------------------------------------------------

-- 

-- Struttura della tabella `corporazioni`

-- 

CREATE TABLE IF NOT EXISTS `corporazioni` (

  `corporazioni_id` int(11) NOT NULL default '0',

  `pg_id` int(11) default NULL,

  `ruolo` varchar(255) NOT NULL,

  `simbolo` varchar(255) NOT NULL,

  `livello` varchar(255) NOT NULL,

  `data` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

  PRIMARY KEY  (`corporazioni_id`),

  KEY `pg_id` (`pg_id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- 

-- Dump dei dati per la tabella `corporazioni`

-- 

-- --------------------------------------------------------

-- 

-- Struttura della tabella `pg`

-- 

CREATE TABLE IF NOT EXISTS `pg` (

  `pg_id` int(11) NOT NULL auto_increment,

  `username` varchar(255) NOT NULL,

  `password` varchar(255) NOT NULL,

  `email` varchar(255) NOT NULL,

  `sesso` varchar(255) NOT NULL,

  `razza` varchar(255) NOT NULL,

  `DescFisica` text,

  `DescPersonal` text,

  `DescAffetti` text,

  `DescFull` text,

  `stipendio` varchar(255) NOT NULL,

  `banca` varchar(255) NOT NULL,

  `denaro` varchar(255) NOT NULL,

  `lavoro` varchar(255) NOT NULL,

  `lavoroData` varchar(255) NOT NULL,

  `esperienza` varchar(255) NOT NULL,

  `max_esperienza` varchar(255) NOT NULL,

  `popolarita` varchar(255) NOT NULL,

  `max_popolarita` varchar(255) NOT NULL,

  `IngressoData` varchar(255) NOT NULL,

  `simbolo` varchar(255) NOT NULL,

  `livello` varchar(255) NOT NULL,

  `newsletter` varchar(255) NOT NULL,

  `ip` varchar(255) NOT NULL,

  `reg` int(11) default NULL,

  `bannato` varchar(255) NOT NULL,

  `bannatoData` varchar(255) NOT NULL,

  `bannatoMemo` text,

  `user_ruolo` varchar(255) NOT NULL,

  `user_admin` int(11) default NULL,

  `datareg` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

  PRIMARY KEY  (`pg_id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- 

-- Dump dei dati per la tabella `pg`

-- 

-- 

-- Limiti per le tabelle scaricate

-- 

-- 

-- Limiti per la tabella `corporazioni`

-- 

ALTER TABLE `corporazioni`

  ADD CONSTRAINT `corporazioni_ibfk_1` FOREIGN KEY (`pg_id`) REFERENCES `pg` (`pg_id`) ON DELETE CASCADE ON UPDATE CASCADE;
risposto 8 anni fa
lab82
X 0 X

E' normale che non sia come te l'aspettavi, infatti in SQL esistono diversi modi per ottenere lo stesso risultato.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda