2011-04-13 20 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

相关问题