2011-04-13 19 views
2

我有一個表,其中的一列中我將指定實體的類型。實體只能有三種類型 - 標題,圖像或註釋,因此我想確保表格列應該只接受一個這三個字符串。有沒有辦法把這個約束在ms sql server 2008?有沒有辦法強制數據庫表的列的一組值?

編輯: - 添加了db圖以獲得改進設計的提示。

設計: - 1)故事板上有許多幻燈片,每張幻燈片可以有一個或多個標題或圖像。

2)每個故事板可以有一個或多個作者,以及零個或多個評論者。

3)每個對象的圖像,幻燈片和標題(可能更多的對象後來會像音頻等)可以有他們的意見。這些評論可以由作者或評論者給出。 用於存儲評論我創建了評論表。

4)有必要記住幻燈片的順序和幻燈片中的圖像順序,爲此我使用幻燈片和圖像編號字段。由於它們的引用將被存儲在註釋表中,所以我需要爲每個對象都有一個全局ID。爲了維護一個全局ID,所有以名稱GID是使用Default:NEWID()生成的uniqueidentifiers。

請爲此db設計提出改進建議。

Database Diagram

+0

嘿deovrat,你應該選擇一個答案接受和發佈這是一個新的問題。答覆發佈後更改問題會導致未來訪問者感到困惑。只是一個建議。 – Milimetric 2011-04-14 13:20:19

+0

感謝您的建議:),我在這裏發佈了一個新問題 http://stackoverflow.com/questions/5660583/suggest-improvements-for-the-database-design – 2011-04-14 14:05:40

回答

1

啊哈,問題的性質在這種情況下是不同的!因此我在這裏第二個答案。

我承認我不是100%確定'最好'的解決方案是什麼。我想你打算如何查詢這些數據會在一定程度上決定你存儲它的方式。

從您發佈的額外信息中,我建議剝離Comment表,以便它只有存儲有關評論的信息。丟失ObjID, ObjType字段,可能還有usertype - 不應該在User表中嗎?

然後,我建議ading三個新表格,您的模式:SlideCommentCaptionCommentImageComment,每個只有兩個字段:
一個存儲CommentId(這將有FK到Comment表)和另一以適當的方式存儲幻燈片,標題或圖像GID。

因此,這些新表格僅用於將Comment加入其中的任何實體。這應該使您能夠以您想要的方式查詢數據,而不必擔心它引用的是哪個「實體」。

-1

使用檢查約束或觸發器BEFORE INSERT,UPDATE和代碼這個驗證到它。

+1

**沒有!**一個簡單的檢查約束可以更有效地做到這一點,然後優化器可以使用這些信息。 – 2011-04-13 13:30:22

+0

對,對不起,-1。觸發器可能工作,但他們應該是最後的手段。如果不謹慎使用,它們是維護和測試的噩夢。 – Milimetric 2011-04-13 13:33:08

+0

感謝球員的投入。 – Priyank 2011-04-13 13:39:41

4

聽起來像Foreign Keys的工作?

+1

+1這絕對是正確的設計,但檢查約束可能更輕。 – Milimetric 2011-04-13 13:35:58

+0

@Milimetric - 有些人會質疑FK是「正確」的方式。只是試圖找到一個博客文章,我在這個問題上閱讀...編輯:發現它http://weblogs.sqlteam.com/davidm/archive/2004/02/17/882.aspx – 2011-04-13 13:37:23

+0

看到我的推理迴應@ Milimetric的答案。 @Martin:我看到了這個博客中的觀點,但我會說從第一個評論中引用這句話是爲什麼它不適合我 - 「不僅如此,而且如果值處於CHECK約束中,你無法列舉'允許'值是什麼「 – Widor 2011-04-13 13:38:46

6

這是你如何檢查約束做到這一點:

create table #tableWithConstrainedColumn (
    constrainThis varchar(20) 
) 

ALTER TABLE #tableWithConstrainedColumn ADD CONSTRAINT TempCheck 
    CHECK (constrainThis in ('caption', 'image', 'comment')) 

-- this statement will succeed 
insert into #tableWithConstrainedColumn 
select 'caption' 
-- this statement will fail 
insert into #tableWithConstrainedColumn 
select 'captions' 

drop table #tableWithConstrainedColumn 

您還可以定義數據類型,但我不建議做這種方式:http://msdn.microsoft.com/en-us/library/aa933121(v=sql.80).aspx

由於@Widor只是推薦,外鍵將是最好的方式來做到這一點。

+1

這可能會縮短爲'CHECK(constrainThis IN('caption','image','comment'))' – Laas 2011-04-13 13:36:02

+0

我傾向於創建一個表「實體」(如@deovrat稱爲它們),以'Caption','Image'和'Comment'作爲具有自己ID的記錄。然後,不要將實體名稱插入到主表中,而要創建一個FK,以確保EntityID是實體表中定義的實體名稱之一。這樣,沒有人可以刪除主表中的一種實體和孤立記錄。 – Widor 2011-04-13 13:37:32

+0

我已經添加了數據庫的圖表和說明。請建議您可以考慮的設計方面的改進。謝謝 – 2011-04-14 10:47:30

相關問題