PDA

View Full Version : [SQL] qualche dubbio da niubbo :D


afsdfdlecosdfsfdcco
15-03-2008, 17:23
Premessa: di SQL non conosco praticamente nulla :D

Allora, per il mio programma avrei bisogno di una tabella simile:

CREATE TABLE SNIPPETS (
CATEGORY VARCHAR(50) NOT NULL,
NAME VARCHAR(100) NOT NULL,
TAGS VARCHAR(200) NOT NULL,
CODE VARCHAR(10000) NOT NULL,
DESCRIPTION VARCHAR(1000) NOT NULL
);

Ecco, avrei qualche dubbio:

1) "TAGS" dovrebbe essere un vettore di "TAG"... Come posso scriverlo? (se si può)
2) se un campo è opzionale è sufficiente togliere "NOT NULL"?
3) "NAME" dovrebbe essere un identificatore (univoco). Come lo scrivo?
4) devo per forza scrivere tutto maiuscolo?

Grazie ^^

(si, sono veramente niubbo con SQL)

amedeoviscido
15-03-2008, 17:51
Premessa: di SQL non conosco praticamente nulla :D

Allora, per il mio programma avrei bisogno di una tabella simile:

CREATE TABLE SNIPPETS (
CATEGORY VARCHAR(50) NOT NULL,
NAME VARCHAR(100) NOT NULL,
TAGS VARCHAR(200) NOT NULL,
CODE VARCHAR(10000) NOT NULL,
DESCRIPTION VARCHAR(1000) NOT NULL
);

Ecco, avrei qualche dubbio:

1) "TAGS" dovrebbe essere un vettore di "TAG"... Come posso scriverlo? (se si può)
2) se un campo è opzionale è sufficiente togliere "NOT NULL"?
3) "NAME" dovrebbe essere un identificatore (univoco). Come lo scrivo?
4) devo per forza scrivere tutto maiuscolo?

Grazie ^^

(si, sono veramente niubbo con SQL)

mmm vediamo. Innanzitutto la clausola "NOT NULL" dice al motore SQL di rifiutare il valore NULL per il campo. Quindi così come l'hai scritta tutti i campi sono obbligatori. Un'altra clausola è "UNIQUE" ovvero unico: non ammette duplicati fra le righe per quel campo. La loro combinazione, NOT NULL UNIQUE, implica che è obbligatorio ed univoco: ovvero è una chiave, e lo puoi scrivere come PRIMARY KEY. Quindi abbiamo risposto al punto 3:

NAME VARCHAR(100) PRIMARY KEY

Per risolvere il quesito al punto 1, io farei diversamente: crea una tabella con chiave primaria la combinazione (NAME,TAG) ovvero


CREATE TABLE nametags (
NAME VARCHAR(100),
TAG VARCHAR(200),
PRIMARY KEY(NAME,TAG)
)


2) SI
4) assolutamente no

amedeoviscido
15-03-2008, 17:59
Se il tuo dbms supporta le foreign key allora scriverei anche:

CREATE TABLE nametags (
NAME VARCHAR(100),
TAG VARCHAR(200),
PRIMARY KEY(NAME,TAG),
NAME REFERENCES snippets(NAME)
)

Ovvero, ti assicuri che il campo "NAME" sia effettivamente presente all'interno del database. Ovviamente, se dovrai inserire dei nuovi tag nella tabella nametags, avrai prima bisogno di creare lo snippet relativo :D

afsdfdlecosdfsfdcco
15-03-2008, 18:15
Grazie mille ad entrambi ^^
Come dbms uso "Derby" (un dbms java)


Per risolvere il quesito al punto 1, io farei diversamente: crea una tabella con chiave primaria la combinazione (NAME,TAG) ovvero


CREATE TABLE nametags (
NAME VARCHAR(100),
TAG VARCHAR(200),
PRIMARY KEY(NAME,TAG)
)




Quindi la mia tabella diverrebbe:

CREATE TABLE SNIPPETS (
CATEGORY VARCHAR(50) NOT NULL,
CODE VARCHAR(10000) NOT NULL,
DESCRIPTION VARCHAR(1000) NOT NULL,

TAGS nametags(100) NOT NULL
);


od ho sbagliato?

amedeoviscido
15-03-2008, 18:24
Derby? Mai sentito!!! Mi spiace, non so se supporta le references. Va bene, comunque il codice da te proposto, mi spiace, è sbagliato. Le tabelle da creare sono due, devi fare in questo modo:



CREATE TABLE SNIPPETS (
CATEGORY VARCHAR(50) NOT NULL,
NAME VARCHAR(100) PRIMARY KEY,
CODE VARCHAR(10000) NOT NULL,
DESCRIPTION VARCHAR(1000) NOT NULL
);

CREATE TABLE nametags (
NAME VARCHAR(100),
TAG VARCHAR(200),
PRIMARY KEY(NAME,TAG),
NAME REFERENCES snippets(NAME)
)


eventualmente togliendo la riga NAME REFERENCES...

In pratica devi creare due tabelle. La prima che contiene i dati sulle snippets, l'altra con i tag. Per recuperare i TAG associati al NAME, basta dare questa semplice query in pasto al motore DB:

SELECT tag FROM nametags WHERE name='abc'

afsdfdlecosdfsfdcco
15-03-2008, 20:15
Derby? Mai sentito!!!

http://www.regdeveloper.co.uk/2006/11/08/java_database_derby/


Va bene, comunque il codice da te proposto, mi spiace, è sbagliato. Le tabelle da creare sono due, devi fare in questo modo:



CREATE TABLE SNIPPETS (
CATEGORY VARCHAR(50) NOT NULL,
NAME VARCHAR(100) PRIMARY KEY,
CODE VARCHAR(10000) NOT NULL,
DESCRIPTION VARCHAR(1000) NOT NULL
);

CREATE TABLE nametags (
NAME VARCHAR(100),
TAG VARCHAR(200),
PRIMARY KEY(NAME,TAG),
NAME REFERENCES snippets(NAME)
)



Quindi non è proprio possibile inserire una tabella in una tabella? 8(



In pratica devi creare due tabelle. La prima che contiene i dati sulle snippets, l'altra con i tag. Per recuperare i TAG associati al NAME, basta dare questa semplice query in pasto al motore DB:

SELECT tag FROM nametags WHERE name='abc'

Ok, grazie mille :)

afsdfdlecosdfsfdcco
15-03-2008, 20:58
Un'altra domanda!

CREATE TABLE `web_null_mail` (
`id` int(255) NOT NULL auto_increment,
`mail` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `mail` (`mail`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Mi interessa la parte in neretto (ho trovato il codice su internet): se io volessi memorizzare testi che contengono anche caratteri accentati (sia lettere italiane che caratteri francesi, tedeschi ecc) cosa dovrei usare? E cosa vorrebbe dire "ENGINE=MyISAM"? Scusate la niubbezza :)

afsdfdlecosdfsfdcco
15-03-2008, 21:56
Sto facendo qualche test ma ho qualche problemino. Vi spiego come funziona il programma.

Al momento salvo i dati in questa struttura:
TreeMap<String, TreeMap<String, Snippet>> data

1) l'utente aggiunge una categoria (non deve essere già presente) - il programma SALVA la categoria in una treemap (come chiave, creando una nuova TreeMap vuota come value)
2) l'utente (selezionando una categoria) crea uno snippet (inserendo subito il nome) - il programma aggiunge una chiave nella TreeMap interna.
3) il programma crea un nuovo pannello di edit dove l'utente inserirà i tags, il codice e la descrizione (quest'ultimo campo è facoltativo).
4) salva i nuovi dati al click su "save"


Problema: come devo creare la/le tabelle per non dover riscrivere tutto?
Ad esempio, la categoria dovrebbe essere inserita prima ancora che venga creato lo snippet!

Grazie per la pazienza :)

amedeoviscido
15-03-2008, 22:23
per il charset puoi sostituire con UTF8 o 16. Per il resto se ne riparla domani!!!

afsdfdlecosdfsfdcco
15-03-2008, 22:28
per il charset puoi sostituire con UTF8 o 16. Per il resto se ne riparla domani!!!

Ok grazie mille intanto!