Visa ett inlägg
Oläst 2009-01-11, 23:36 #6
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Nåväl då får jag väl lov att lägga fram ett förslag till annan struktur på databasen.

Vi får väl ta det i små steg, så jag drar inget om index och optimering.

Jag har skissat lite snabbt på en lösning som innebär följande tabeller:

event
egenskap
tillbehor
event_egenskap
event_tillbehor

samt några vyer för att förenkla anropen. Ursäkta att nedanstående exempel är för SQL-server men jag hade int emin MySQL uppe just nu, det bör inte vara allt för stora skillnader på den här nivån dock.

Kod för att skapa tabellerna:

Kod:
CREATE TABLE [dbo].[egenskap] (
	[egenskaper_id] [int] NOT NULL ,
	[egenskap] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[event] (
	[event_id] [int] IDENTITY (1, 1) NOT NULL ,
	[egenskaper] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
	[tillbehor] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[event_egenskap] (
	[event_id] [int] NOT NULL ,
	[egenskap_id] [int] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[event_tillbehor] (
	[event_id] [int] NOT NULL ,
	[tillbehor_id] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[tillbehor] (
	[tillbehor_id] [int] NOT NULL ,
	[tillbehor] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL 
) ON [PRIMARY]
GO
Sen lägger vi till primärnycklar:

Kod:
ALTER TABLE [dbo].[egenskap] ADD 
	CONSTRAINT [PK_egenskap] PRIMARY KEY *CLUSTERED 
	(
 *[egenskaper_id]
	) *ON [PRIMARY] 
GO

ALTER TABLE [dbo].[event] ADD 
	CONSTRAINT [PK_event] PRIMARY KEY *CLUSTERED 
	(
 *[event_id]
	) *ON [PRIMARY] 
GO

ALTER TABLE [dbo].[event_egenskap] ADD 
	CONSTRAINT [PK_event_egenskap] PRIMARY KEY *CLUSTERED 
	(
 *[event_id],
 *[egenskap_id]
	) *ON [PRIMARY] 
GO

ALTER TABLE [dbo].[event_tillbehor] ADD 
	CONSTRAINT [PK_event_tillbehor] PRIMARY KEY *CLUSTERED 
	(
 *[event_id],
 *[tillbehor_id]
	) *ON [PRIMARY] 
GO

ALTER TABLE [dbo].[tillbehor] ADD 
	CONSTRAINT [PK_tillbehor] PRIMARY KEY *CLUSTERED 
	(
 *[tillbehor_id]
	) *ON [PRIMARY] 
GO

Sen lägger vi till vyer:

Kod:
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE VIEW vEventEgenskap AS
SELECT e.event_id as event_id, p.egenskaper_id egenskap_id, p.egenskap as egenskap FROM event_egenskap e, egenskap p WHERE e.egenskap_id=p.egenskaper_id

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE VIEW vEventTillbehor AS
SELECT e.event_id as event_id, t.tillbehor_id tillbehor_id, t.tillbehor as tillbehor FROM event_tillbehor e, tillbehor t WHERE e.tillbehor_id=t.tillbehor_id

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE VIEW vEvent AS
SELECT p.event_id as event_id, p.egenskap_id varde_id, p.egenskap as varde FROM vEventEgenskap p
UNION
SELECT t.event_id as event_id, t.tillbehor_id varde_id, t.tillbehor as varde FROM vEventTillbehor t

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

Fyll tabellerna med värden:


Kod:
--------------------------------------------
-- STEG 2 Populera tabellerna med värden
--------------------------------------------
insert into egenskap(egenskaper_id, egenskap) VALUES (1, 'Färg');
insert into egenskap(egenskaper_id, egenskap) VALUES (2, 'Storlek');
insert into egenskap(egenskaper_id, egenskap) VALUES (3, 'Längd');
insert into egenskap(egenskaper_id, egenskap) VALUES (4, 'Bredd');
insert into egenskap(egenskaper_id, egenskap) VALUES (5, 'Antal');
insert into egenskap(egenskaper_id, egenskap) VALUES (6, 'Ålder');

insert into tillbehor(tillbehor_id, tillbehor) VALUES (1, 'Bilradio');
insert into tillbehor(tillbehor_id, tillbehor) VALUES (2, 'Gaffel');
insert into tillbehor(tillbehor_id, tillbehor) VALUES (3, 'Kniv');
insert into tillbehor(tillbehor_id, tillbehor) VALUES (4, 'Tallrik');
insert into tillbehor(tillbehor_id, tillbehor) VALUES (5, 'Sked');
insert into tillbehor(tillbehor_id, tillbehor) VALUES (6, 'DRicksglas');

insert into event(egenskaper, tillbehor) VALUES ('Exotisk','Gorgonzola');
insert into event(egenskaper, tillbehor) VALUES ('Exotisk','Gorgonzola');
insert into event(egenskaper, tillbehor) VALUES ('Exotisk','Gorgonzola');
insert into event(egenskaper, tillbehor) VALUES ('Exotisk','Gorgonzola');
insert into event(egenskaper, tillbehor) VALUES ('Exotisk','Gorgonzola');


insert into event_tillbehor(event_id, tillbehor_id) VALUES (1,1);
insert into event_tillbehor(event_id, tillbehor_id) VALUES (1,2);
insert into event_tillbehor(event_id, tillbehor_id) VALUES (1,3);
insert into event_tillbehor(event_id, tillbehor_id) VALUES (2,3);
insert into event_tillbehor(event_id, tillbehor_id) VALUES (2,5);
insert into event_tillbehor(event_id, tillbehor_id) VALUES (2,6);

insert into event_egenskap(event_id, egenskap_id) VALUES (1,1);
insert into event_egenskap(event_id, egenskap_id) VALUES (1,2);
insert into event_egenskap(event_id, egenskap_id) VALUES (3,3);
insert into event_egenskap(event_id, egenskap_id) VALUES (2,3);
insert into event_egenskap(event_id, egenskap_id) VALUES (4,5);
insert into event_egenskap(event_id, egenskap_id) VALUES (2,6);
Titta på innehållet i tabellerna, så att vi vet att alla data är korrekt:

Kod:
select * from event;
select * from tillbehor;
select * from egenskap;
select * from event_tillbehor;
select * from event_egenskap;

--------------------------------------------
-- STEG 3 Kontrollera att tabellerna fått rätt värden
--------------------------------------------
SELECT * FROM event_egenskap e, egenskap p WHERE e.egenskap_id=p.egenskaper_id AND event_id=1;
SELECT * FROM event_egenskap e, egenskap p WHERE e.egenskap_id=p.egenskaper_id AND event_id=2;

SELECT * FROM event_tillbehor e, tillbehor t WHERE e.tillbehor_id=t.tillbehor_id AND event_id=1;
SELECT * FROM event_tillbehor e, tillbehor t WHERE e.tillbehor_id=t.tillbehor_id AND event_id=2;
Titta om vi har det vi vill ha:

Kod:
SELECT * FROM vEventEgenskap
Kod:
SELECT * FROM vEventTillbehor

Nu kommer vi fram till den ursprungliga frågeställningen. Den ursprungliga databasen hade inte stöd för denna fråga enligt den tredje normalformen, men denna lösning har det, och det här är ett sätt att lösa problemet på:

Kod:
--------------------------------------------
-- STEG 4 Hur skulle vi nu löst ursprungsfrågan
--------------------------------------------

select * from vEventEgenskap p, vEventTillbehor t WHERE p.egenskap_id IN (1,3,5) OR t.tillbehor_id IN (1,14,7);
Conny Westh är inte uppkopplad   Svara med citatSvara med citat