Relazione molti a molti, colonne tabella di appoggio

lunedì 18 giugno 2012 - 15.43
Tag Elenco Tags  .NET 2.0  |  Windows Server 2003  |  Visual Studio 2010  |  SQL Server 2005

gian77 Profilo | Newbie

Buongiorno a tutti

ecco la mia prima questione da niubbo ;-)
Nella mia applicazione web devo gestire Utenti e Gruppi in relazione molti a molti: ho quindi creato le 3 tabelle Utenti, Gruppi ed Utenti_gruppi; inoltre lo scenario prevede che un utente possa essere amministratore di diversi gruppi e che abbia un gruppo di default.
Al momento io ho modellato la cosa creando la seguente tabella di appoggio Utenti_gruppi:

CREATE TABLE [dbo].[utenti_gruppi](
[id_utente_gruppo] [int] IDENTITY(1,1) NOT NULL,
[id_utente] [int] NOT NULL,
[id_gruppo] [int] NOT NULL,
[is_admin] [bit] NOT NULL,
[is_gruppo_default] [bit] NOT NULL,
CONSTRAINT [PK_utenti_gruppi] PRIMARY KEY CLUSTERED
(
[id_utente_gruppo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[utenti_gruppi] WITH CHECK ADD CONSTRAINT [FK_utenti_gruppi_gruppi] FOREIGN KEY([id_gruppo])
REFERENCES [dbo].[gruppi] ([id_gruppo])
GO
ALTER TABLE [dbo].[utenti_gruppi] CHECK CONSTRAINT [FK_utenti_gruppi_gruppi]
GO
ALTER TABLE [dbo].[utenti_gruppi] WITH CHECK ADD CONSTRAINT [FK_utenti_gruppi_utenti] FOREIGN KEY([id_utente])
REFERENCES [dbo].[utenti] ([id_utente])
GO
ALTER TABLE [dbo].[utenti_gruppi] CHECK CONSTRAINT [FK_utenti_gruppi_utenti]
GO

è corretto? oppure è meglio mettere il gruppo di default sulla tabella Utente?

Grazie mille!!

lbenaglia Profilo | Guru

>è corretto? oppure è meglio mettere il gruppo di default sulla
>tabella Utente?

Ciao,

A mio avviso è corretto dato che la tabella risulta in 3a NF.
L'unica cosa che farei è rimuovere la colonna IDENTITY [id_utente_gruppo] (che non serve a niente dal punto di vista logico) definendo la PK sulle colonne [id_utente] e [id_gruppo]. Essendo 2 int lo "spreco" di spazio è veramente trascurabile

>Grazie mille!!
Prego.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/

gian77 Profilo | Newbie

Ciao Lorenzo e grazie delle dritte ;-)

>A mio avviso è corretto dato che la tabella risulta in 3a NF.
OK. Mi rimaneva il dubbio che l'informazione sul gruppo di default, essendo un attributo dell'Utente, andasse nella tabella Utente.

>L'unica cosa che farei è rimuovere la colonna IDENTITY [id_utente_gruppo]
>(che non serve a niente dal punto di vista logico) definendo
>la PK sulle colonne [id_utente] e [id_gruppo]. Essendo 2 int
>lo "spreco" di spazio è veramente trascurabile
Fatto, grazie; spesso ho l'abitudine, senza pensarci troppo, di usare come PK una identity: è in ogni caso da considerarsi una bad practice?

Grazie ancora
Ciao
Gianluca

lbenaglia Profilo | Guru

>OK. Mi rimaneva il dubbio che l'informazione sul gruppo di default,
>essendo un attributo dell'Utente, andasse nella tabella Utente.
Non è un attributo del solo utente, ma dipende dall'intera PK (id_utente ed id_gruppo) pertanto è giusto che stia nella junction table.

>Fatto, grazie; spesso ho l'abitudine, senza pensarci troppo,
>di usare come PK una identity: è in ogni caso da considerarsi
>una bad practice?
No, solo un inutile spreco di spazio

>Grazie ancora
Prego.

Ciao!
--
Lorenzo Benaglia
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5