Newsgroup: it.comp.lang.delphi
Titolo: Leggermente OT [Database]

Ciao,
vorrei sapere quale e' la differenza tra  un database Access ed un server
database tipo MySQL...
Non sono molto pratico di db e vorrei migrare la mia applicazione verso un
altro db.
Ciao

Access è un db file server.
Ovvero, tutti accedono ad un solo file posto da qualche parte e tutti
leggono e scrivono sul suddetto file.
Un database client/server come Orcale, Sybase etc è strutturato in modo
diverso.
Esiste una applicazione server (nel caso di winnt e successivi in genere è
un servizio..) che gira sul server dove risiese fisicamente il tuo database.
I client, con un apposito programma "client" si connettono alla suddetta
applicazione server per dirgli cosa fare.
In pratica il client non accede fisicamente al db, ma "dice" al server:
leggi, scrivi, cerca, elimina, fai questo et similia.
In questo modo, il client delega al server database tutte le operazioni.
Nel caso di Oracle, lo svantaggio è, a parte il costo, che la applicazione
server usa molte risorse di sistema e quindi serve un pc server tosto, dove
magari si faccia girare solo lui.
Inoltre, tieni conto del fatto che oracle, sybase interbase etc hanno una
serie di strumenti in più che access non ha, tipo le stored procedure e i
trigger.
Una stored procedure non è altro che una procedura scritta in sql contenuta
nel database insieme ai tuoi dati che può essere richiamata dal codice della
tua applicazione.
Vantaggi?
Tutte le operazioni vengono esegute lato server, quindi niente traffico di
rete.
Un trigger è simile ad una store procedure, con la differenza che viene
associata a degli eventi di una tabella.
Ad esempio, data la tabella Pippo, puoi associare un trigger all'evento
BEFORE INSERT o AFTER INSERT  per fargli fare un qualcosa su altre tabelle.
Una cosa simile ai vari eventi della tquery, tipo OnBeforePost, OnAFterPost
etc...
con la differenze che non viene fatto dalla tua applicazione, ma dal
database.
Pensa prima di tutto a quanto codice risparimiato, e poi alla possibilità di
accedere allo stesso db da applicazioni diverse, o ancora da applicazioni
scritte in linguaggi diversi.
Bye
AS

 diverso.
[CUT]
Grazie, sei stato molto esaustivo.
Da quello che ho capito, se voglio creare una applicazione che gestisca un
db remoto
e' meglio usare un db client\server.
Avevo pensato di usare MySQL perchè gratuito. Che ne pensi?
Ciao

 wrote in message
news:tzxt8.8790$b62.2...@news1.tin.it...


> Avevo pensato di usare MySQL perchè gratuito. Che ne pensi?
Ho molte perplessità su MySql.
Da quel poco che so, non gestisce le foreign key.
E questa, imho, è una grossa limitazione.
Inoltre, sembra che via dbexpress faccia cose strane.
Non so se è lui o il driver.
Bye
AS

 Inoltre, sembra che via dbexpress faccia cose strane.
Il driver fornito da Borland aveva qualche problema.
Ora dovrebbe essere ok.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

ma non indispensabile.
Cosa intendi dire? la foreign key fattibile attraverso successive
select?
Scusa ma non capisco (io concordo sul fatto che la mancanza di Foreign
key sia una grave limitazione).
Ciao, Rocco.

 Nessuno è in grado di farlo funzionare ???????
Hai gia' scaricato e installato la public beta del 30 Marzo ?
http://community.borland.com/article/0,1410,28590,00.html


 key sia una grave limitazione).
Come gia' detto, a mio avviso, non lo e'.


Hai provato a connetterti con il DBExpress ad un server??
In locale funziona benissimo, ma anche se nell'hostname gli passi il nome
del server cerca di connettersi ugualmente al localhost (anche con l'IP è
uguale).

 E questa, imho, è una grossa limitazione.
inoltre non gestisce le subselect, i trigger, le viste e forse anche
qualcos'altro che non ricordo..
io l'ho installato, ma con delphi l'accesso non e' stato molto positivo. Ho
provato i componenti zeus ma mi danno access violation.. Ho trovato un
componente che andava ma non e' il massimo di comodita'.. ad esempio
necessita di una connessione per ogni query..
per il resto non so, non ho moltissima esperienza in db :)


Hai ragione per quanto riguarda l'estrazione dei dati, ma il ruolo della
foreign key è proprio di garantire l'integrità logica dei dati. Ad esmpio
per impedire che qualcuno cancelli record a cui fanno riferimento altre
tabelle. Lasciare questo alla "disciplina" di chi usa il tuo database è
moooolto pericoloso.
G.


Forse xche non le usi?   ;-)
Ciao, Rocco

moooolto pericoloso.
Di fatto inuttilizzabile.
Massimo.
-- 
Ore 18.30: premo invio.

 moooolto pericoloso.
Non va affatto lasciato tutto questo alla disciplina di chi usa
il tuo database.  Non so, poi, se i tuoi utenti hanno l'abitudine
di lanciare query sulla tua base dati.  Sarebbe un altro discorso.
I miei, generalmente, si accontentano di utilizzare il programma e
se il programma gli impedisce di cancellare dei dati a cui fanno
riferimento altri dati, a loro tanto basta.
Questo controllo e' comunque fattibile, anche senza supporto da
parte del DBMS.  Io per "limite" intendo qualcosa oltre la quale
non si puo' andare.  MySQL permette di aggirare la mancanza di
molte caratteristiche built-in di altri DBMS, anche se a volte
in modo troppo arzigogolato.
Siamo al discorso di partenza.  Se si considerano questi aspetti
come delle comodita' mancanti, allora siamo d'accordo al 1000 per
1000.  Non le ritengo "indispensabili" dal punto di vista del
corretto funzionamento di un programma, anche se il concetto di 
"indispensabilita'" poi, e' comunque relativo.  
Per la cantante Madonna e' indispensabile avere un frigobar 
nella propria camera d'albergo, per me no :)


 Forse xche non le usi?   ;-)
Devo rispondere ? :)


 "indispensabilita'" poi, e' comunque relativo.
Beh certo. Ma il tuo DB in se non è un'entità unica coerente. Non ha una
logica organizzata in modo consistente.
Hai una tabella con dei record che potrebbero non significare nulla. Non mi
pare una mancanza da poco...

 Hai una tabella con dei record che potrebbero non significare nulla. 
Non l'ho capita.  Se ho una tabella ordini, in cui compaiono
ordini non relativi ad alcun cliente, vuol dire che ad essere
organizzato male e' il mio programma, che, non avendo supporto
dal DBMS, non gestisce bene i vincoli tra i dati.



Condivido alcune cose che hai detto, ma vorrei chiarire quest'ultima.
Da come concepisco io un DD, questo ha una struttua logica cge esula da
qualsiasi programma che lo può usare. Questo vuol dire che ogno record è
un'entità ben precisa, e spesso è in relazione logica con altre entità
(resto sul vago  ;o)) ). Ora se hai un record ordini con IdCliente=N dove N
non esite, cosa rappresenta quel record? Nulla. Per cui la tua base dati è
incoerente, hai entità che non hanno significato, o peggio, potrebbero
portarti a grossi casini quando il cliente N viene effettivamente inserito.
Nel nostro esempio questo significherebbe che al nuovo cliente viene
affibbiato un ordine mai eseguito. Sai cosa comporterebbe questo? Mazzuolate
sulle orecchie!
Con una semplice foreign key la logica del DB sarebbe autocompleta. Nessuna
possibilità di incoerenze. Quindi maggiore "blindatura" dei miei dati.
Gianandrea.

possibilità di incoerenze. Quindi maggiore "blindatura" dei miei dati.
Benissimo, siamo arrivati al punto: l'indispensabilita'.
La domanda che ti faccio e' : e' indispensabile (dal punto
di vista funzionale, non da quello di comodita' di utilizzo)
che vi sia il supporto per le foreign key, perche' la mia
base rimanga coerente ?
Risposta: no.  Non ci sara' "autocompletezza", ma poco
importa, perche' basta che la tua applicazione implementi
correttamente tutti i vincoli necessari a mantenere la base
dati coerente.
Onestamente, un programma che consente di inserire un
ordine, senza verificare che sia stato selezionato un
cliente per quell'ordine, e' un programma scritto coi piedi.
Non ci vuole un Nobel per capire che l'ordine e' dipendente
da un cliente e quindi bisogna che vi sia prima
un'informazione e poi l'altra.  Stessa cosa quando si
cancella il cliente (se mai si cancellasse).  Non si puo'
mantenere degli ordini che non appartengono piu' a nessuno.
E cosi' via...
Ora: siamo d'accordo che le "foreign key" sono di ausilio
per individuare in automatico queste situazioni e
consentirti di gestirle senza pericolo, ma il fatto che un
DBMS non le supporti, non vuol affatto dire che la base dati
di un qualsiasi programma, prima o poi, risultera'
incoerente.  Bisogna vedere come e' scritto il programma.
Era solo questo che volevo precisare, mi sembra che abbiamo
detto tutto a riguardo ;)
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

 Non so se è lui o il driver.
Al di la di quello che fa con dbexpress (o meglio le cose strane che fa
dbexpress), c'è da specificare alcune cose:
MySql ha alcune limitazioni volute....le cose che sono state ritenute non
stettamente necessarie non sono state implementate di proposito per
consentire una leggerezza ed una velocità che pochi altri db commerciali
hanno. Devi pensare che MySql è nato per lavorare on line dove la velocità,
anche quando ci sono migliaia di connessioni contemporanee, è un punto
cruciale (non per niente è usatissimo in internet anche da compagnie
blasonate quali Yahoo).
Per la gestione delle foreign key, se da un lato hai ragione, dall'altro c'è
da dire che il progetto mysql si è diviso in due: pur rimanendo mysql,
adesso esiste MySQL-Max che si occupa di implementare le caratteristiche che
hanno anche altri server SQL.
Ciao
Gianni Giusti

 Da quel poco che so, non gestisce le foreign key.
Comunque saranno implementate nella versione 4.1
http://www.mysql.com/doc/T/O/TODO_MySQL_4.1.html
Ciao
Gianni Giusti

 provato i componenti zeus ma mi danno access violation.
Io li stò usando in modo molto positivo (con progetti di magazzino da
clienti e progetti di ecommerce) e funzionano meravigliosamente
bene.......hai usato i componenti 5.3.0.5  o la versione 3? hai provato ad
attivare la connessione unicamente all'esecuzione dell'applicazione?
Ciao
Gianni Giusti

Per chi considera MySql un giocattolino ricordo che:
(dal sito di mysql)
Handles large databases. We are using MySQL Server with some databases that
contain 50,000,000 records and we know of users that uses MySQL Server with
60,000 tables and about 5,000,000,000 rows.
Le altre features le trovate in questo link:
http://www.mysql.com/doc/F/e/Features.html
Ciao
Gianni Giusti

 attivare la connessione unicamente all'esecuzione dell'applicazione?
si ho la 5.3 b5 ... ho provato in tutti i modi,  ma proprio non vuole
saperne.. penso sia un problema con la dll, infatti spulciando il codice la
chiamata che da l'errore e':
{ Making capability with old libmysql.dll }
procedure mysql_seek(Result: PMYSQL_RES; Offset: Cardinal);
{$IFNDEF OLD_LIBMYSQL_DLL}
var
  Temp: TInt64;
begin
  Temp.Data := Offset;
  Temp.Pad := 0;
  mysql_data_seek(Result, Temp);
end;
{$ELSE}
begin
  mysql_data_seek(Result, Offset);
end;
{$ENDIF}
nella unit ZDirMySql.
Non so, occorre fare qualcosa prima di connettersi, tipo caricare la dll o
simili ?
Anche l'esempio fornito nel pacchetto da lo stesso errore..
grazie!
--
{MSX}  -  
http://msx.rules.it
Mantenitore delle FAQ di it.comp.lang.delphi,
reperibili qui: 
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt