Forum DB design query
From: Harag (haragREMOVETHESECAPITALS_at_softhome.net)
Date: 08/25/04
- Next message: Martin Selway: "Re: Complicated stored procedure"
- Previous message: hkvats_1999_at_yahoo.com: "Re: Passing a table or cursor into a stored procedure"
- Next in thread: Anith Sen: "Re: Forum DB design query"
- Reply: Anith Sen: "Re: Forum DB design query"
- Messages sorted by: [ date ] [ thread ]
Date: Wed, 25 Aug 2004 08:40:18 +0100
Hi all
backend: SQL Server 2k (dev ed)
frontend: ASP IIS5 jScript.
First let me apolgise for the length of this post, but I have included
all the DLL & example inserts below, also I'm new to Stored Procs/db
design.
I'm trying to create a simple forum system that will be hard for
members to hack into (by changing an url on the fron end browser) to
read forums that they shouldn't read.
Each member has 2 values (Skill and Prof) each forum also has these 2
values, members are only allowed to read/post the forums that have the
same 2 numbers as the member, the forums are then split down into
several types (general, support, tech help, etc.) so they will be
several forums for each pair of (skill & prof) values.
I will have 3 main stored procs that return the following info (forum
list, topic list, message list) the value in the brackets below is the
only info that the stored proc needs. from this info it can (by
joining tables) work out what the member needs to see.
Also note that the getTopicsList & getMessagesList Stored Procs will
use the EXCELLENT "rowcount" paging system created by Chris Hohmann
(thanks Chris) found at http://www.aspfaq.com/2120 With this in mind
the SELECT commands in those 2 stored procs will be repeated 3 times.
If you know his paging proc you will know why its 3 times.
getForumsList (MemberID)
getTopicsList (MemberID, ForumType, (& paging info))
getMessagesList (MemberID, TopicID, (& paging info))
Below is my "simulated" Select commands to return the info in QA. at
the bottom is all the actual DDL to run the tests on. (I know NOT to
use select *, I only do it in testing as its quicker. in the actual
stored procs I do put all the column names needed).
What I'm basically asking is if they will be any problem with joining
several tables together like the below (3 times in the bottom 2 cases
for paging) for a forum system. or should I rethink it? could any
other problem occure you might think of?
Thanks for ANY help/advice on this.
Al.
------------------------------------------------------------------
DECLARE @mem INT
DECLARE @fType TINYINT
DECLARE @topic INT
SELECT @mem=1, @fType=1, @topic=5
-- Get the member info
SELECT m.* FROM Members m WHERE m.MemID = @mem
-- Find the all forums for member @mem
-- This will be in the getForums(@mem) Stored Proc
SELECT f.* FROM Forums f
INNER JOIN Members m
ON m.Skill = f.Skill AND m.Prof = f.prof
WHERE m.MemID = @mem
-- get list of topics in @fType for member @mem
-- This will be in the getTopics(@mem, @fType) Stored Proc
-- 3 times for paging
SELECT t.* FROM Topics t
INNER JOIN Forums f
ON t.ForumID = f.ForumID
INNER JOIN Members m
ON m.Skill = f.Skill AND m.Prof = f.prof
WHERE m.MemID = @mem AND f.ForumType = @fType
ORDER BY LastPost DESC
-- get list of messages in @topic (and the posters Name)
-- This will be in the getMessages(@mem, @topic) Stored Proc
-- If a member hacks the "url" and changes the topic ID
-- then this will return NO rows of data to the frontend.
-- 3 times for paging
SELECT msg.*, p.MemName FROM Messages msg
INNER JOIN Members p
ON msg.PosterID = p.MemID
INNER JOIN Topics t
ON msg.TopicID = t.TopicID
INNER JOIN Forums f
ON t.ForumID = f.ForumID
INNER JOIN Members m
ON m.Skill = f.Skill AND m.Prof = f.prof
WHERE m.MemID = @mem AND t.TopicID = @topic
ORDER BY msg.MessageID ASC
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
-- Now all the DDL (sorry for the length):
-- I used QAlite to get this info which seems to insist on
-- putting the DB name... So before running you will need
-- to create a DB with the name of "Forum". or do a search
-- and replace. (Forum.dbo. >to> "")
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
------------------------------------------------------------------
/*** Drop [Forum]..[Members] ***/
if object_id(N'dbo.Members','u') is not null
drop table [dbo].[Members]
GO
/*** Create [Forum]..[Members] ***/
CREATE TABLE [Members] (
[MemID] int IDENTITY(1,1) NOT NULL ,
[Skill] int NOT NULL ,
[Prof] int NOT NULL ,
[MemName] varchar (30) COLLATE SQL_Latin1_General_CP1_CI_AS
NOT NULL ,
CONSTRAINT [PK_Members] PRIMARY KEY CLUSTERED ([MemID]))
GO
Set IDENTITY_INSERT [Forum.dbo.Members] ON
GO
INSERT INTO [Forum.dbo.Members] ([MemID],[Skill],[Prof],[MemName])
VALUES(1,1,1,'Bill')
INSERT INTO [Forum.dbo.Members] ([MemID],[Skill],[Prof],[MemName])
VALUES(2,1,2,'Ted')
INSERT INTO [Forum.dbo.Members] ([MemID],[Skill],[Prof],[MemName])
VALUES(3,1,3,'Fred')
INSERT INTO [Forum.dbo.Members] ([MemID],[Skill],[Prof],[MemName])
VALUES(4,1,1,'Joe')
INSERT INTO [Forum.dbo.Members] ([MemID],[Skill],[Prof],[MemName])
VALUES(5,2,1,'Harry')
INSERT INTO [Forum.dbo.Members] ([MemID],[Skill],[Prof],[MemName])
VALUES(6,2,3,'Alison')
GO
Set IDENTITY_INSERT [Forum.dbo.Members] OFF
GO
/*** Drop [Forum]..[Forums] ***/
if object_id(N'dbo.Forums','u') is not null
drop table [dbo].[Forums]
GO
/*** Create [Forum]..[Forums] ***/
CREATE TABLE [Forums] (
[ForumID] int IDENTITY(1,1) NOT NULL ,
[Skill] int NOT NULL ,
[Prof] int NOT NULL ,
[ForumType] tinyint NOT NULL ,
[ForumName] varchar (30) COLLATE SQL_Latin1_General_CP1_CI_AS
NOT NULL CONSTRAINT [DF_Forums_ForumName] DEFAULT ('General'),
CONSTRAINT [PK_Forums] PRIMARY KEY CLUSTERED ([ForumID]),
CONSTRAINT [IX_Forums] UNIQUE NONCLUSTERED
([Skill],[Prof],[ForumType]))
GO
Set IDENTITY_INSERT [Forum.dbo.Forums] ON
GO
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(1,1,1,1,'General')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(2,1,1,2,'Support')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(3,1,1,3,'Tech Help')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(4,1,2,1,'General')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(5,1,2,2,'Support')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(6,1,2,3,'Tech Help')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(7,1,3,1,'General')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(8,1,3,2,'Support')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(9,1,3,3,'Tech Help')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(10,2,1,1,'General')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(11,2,1,2,'Support')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(12,2,1,3,'Tech Help')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(13,2,3,1,'General')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(14,2,3,2,'Support')
INSERT INTO [Forum.dbo.Forums]
([ForumID],[Skill],[Prof],[ForumType],[ForumName])
VALUES(15,2,3,3,'Tech Help')
GO
Set IDENTITY_INSERT [Forum.dbo.Forums] OFF
GO
/*** Drop [Forum]..[Topics] ***/
if object_id(N'dbo.Topics','u') is not null
drop table [dbo].[Topics]
GO
/*** Create [Forum]..[Topics] ***/
CREATE TABLE [Topics] (
[TopicID] int IDENTITY(1,1) NOT NULL ,
[ForumID] int NOT NULL ,
[Subject] varchar (30) COLLATE SQL_Latin1_General_CP1_CI_AS
NOT NULL ,
[LastPost] datetime NOT NULL CONSTRAINT [DF_Topics_LastPost]
DEFAULT (getdate()),
CONSTRAINT [PK_Topics] PRIMARY KEY CLUSTERED ([TopicID]),
CONSTRAINT [FK_Topics_Forums] FOREIGN KEY ([ForumID])
REFERENCES [dbo].[Forums] ([ForumID]))
GO
Set IDENTITY_INSERT [Forum.dbo.Topics] ON
GO
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(1,1,'Topic 1 form
1','25/08/2004 07:23:44')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(2,1,'Topic 2 form
1','25/08/2004 07:23:50')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(3,1,'Topic 3 form
1','25/08/2004 07:23:52')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(4,1,'Topic 4 form
1','25/08/2004 07:23:53')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(5,1,'Topic 5 form
1','25/08/2004 07:23:57')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(6,1,'Topic 6 form
1','25/08/2004 07:24:03')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(7,1,'Topic 7 form
1','25/08/2004 07:24:11')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(8,1,'Topic 8 form
1','25/08/2004 07:24:27')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(9,2,'Topic 9 form
2','25/08/2004 07:24:33')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(10,3,'Topic 10 form
3','25/08/2004 07:24:43')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(11,2,'Topic 11 form
2','25/08/2004 07:25:01')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(12,4,'Topic 12 form
4','25/08/2004 07:25:39')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(13,5,'Topic 13 form
5','25/08/2004 07:25:46')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(14,6,'Topic 14 form
6','25/08/2004 07:25:57')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(16,7,'Topic 16 form
7','25/08/2004 07:26:10')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(17,8,'Topic 17 form
8','25/08/2004 07:26:17')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(18,9,'Topic 18 form
9','25/08/2004 07:26:21')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(19,10,'Topic 19 form
10','25/08/2004 07:26:40')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(20,11,'Topic 20 form
11','25/08/2004 07:27:01')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(21,12,'Topic 21 form
12','25/08/2004 07:27:35')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(22,13,'Topic 22 form
13','25/08/2004 07:27:46')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(23,14,'Topic 23 form
14','25/08/2004 07:27:54')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(24,15,'Topic 24 form
14','25/08/2004 07:28:06')
INSERT INTO [Forum.dbo.Topics]
([TopicID],[ForumID],[Subject],[LastPost]) VALUES(25,1,'Topic 25 form
1','25/08/2004 07:28:16')
GO
Set IDENTITY_INSERT [Forum.dbo.Topics] OFF
GO
/*** Drop [Forum]..[Messages] ***/
if object_id(N'dbo.Messages','u') is not null
drop table [dbo].[Messages]
GO
/*** Create [Forum]..[Messages] ***/
CREATE TABLE [Messages] (
[MessageID] int IDENTITY(1,1) NOT NULL ,
[TopicID] int NOT NULL ,
[PosterID] int NOT NULL CONSTRAINT [DF_Messages_PosterID]
DEFAULT (1),
[DatePosted] smalldatetime NOT NULL CONSTRAINT
[DF_Messages_DatePosted] DEFAULT (getdate()),
[Subject] varchar (30) COLLATE SQL_Latin1_General_CP1_CI_AS
NOT NULL CONSTRAINT [DF_Messages_Subject] DEFAULT ('''No Sub.'),
[Info] varchar (1000) COLLATE SQL_Latin1_General_CP1_CI_AS NOT
NULL CONSTRAINT [DF_Messages_Info] DEFAULT ('No Info'),
CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED ([MessageID]),
CONSTRAINT [FK_Messages_Members] FOREIGN KEY ([PosterID])
REFERENCES [dbo].[Members] ([MemID]),
CONSTRAINT [FK_Messages_Topics] FOREIGN KEY ([TopicID])
REFERENCES [dbo].[Topics] ([TopicID]))
GO
Set IDENTITY_INSERT [Forum.dbo.Messages] ON
GO
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(1,1,1,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(2,2,4,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(3,3,1,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(4,4,4,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(5,5,1,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(6,6,4,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(7,7,1,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(8,8,4,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(9,9,1,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(10,10,4,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(11,11,1,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(12,12,2,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(13,13,2,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(14,14,2,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(15,16,3,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(16,17,3,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(17,18,3,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(18,19,5,'25/08/2004 07:30:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(19,20,5,'25/08/2004 07:31:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(20,21,5,'25/08/2004 07:31:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(21,22,6,'25/08/2004 07:31:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(22,23,6,'25/08/2004 07:31:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(23,24,1,'25/08/2004 07:31:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(24,25,4,'25/08/2004 07:31:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(25,5,4,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(26,5,4,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(27,5,1,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(28,5,4,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(29,5,1,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(30,5,4,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(31,5,1,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(32,5,4,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(33,5,1,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(34,5,1,'25/08/2004 07:35:00','''No Sub.','No Info')
INSERT INTO [Forum.dbo.Messages]
([MessageID],[TopicID],[PosterID],[DatePosted],[Subject],[Info])
VALUES(35,5,4,'25/08/2004 07:36:00','''No Sub.','No Info')
GO
Set IDENTITY_INSERT [Forum.dbo.Messages] OFF
GO
------------------------------------------------------------------
- Next message: Martin Selway: "Re: Complicated stored procedure"
- Previous message: hkvats_1999_at_yahoo.com: "Re: Passing a table or cursor into a stored procedure"
- Next in thread: Anith Sen: "Re: Forum DB design query"
- Reply: Anith Sen: "Re: Forum DB design query"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|