2017-04-27 66 views
1

我有简单的登记表,但有3个复选框,例如:“你喜欢什么,在自由时间”设计SQL Server数据库正确

Name: [  ] 
Email: [  ] 
Pass: [  ] 
What do you like at free time? 
    Reading: [ ] 
    Travelling: [ ] 
    Sport:  [ ] 

如示例以上你看到的有3个复选框。有多种选择,人们可以只检查阅读复选框或阅读和旅行或所有复选框等。

如何将其正确存储在数据库中?

例如,如果我将在下面创建Users表:

CREATE TABLE #User 
(
    Id INT IDENTITY, 
    Name NVARCHAR(60), 
    Email NVARCHAR(60), 
    Password NVARCHAR(60), 
    FreeTime INT 
) 

我可以从复选框只插入1选择。逗号分隔的解决方案是不好的做法。

我不知道如果在用户表中插入多个记录并使用相同的UserId将所有复选框值插入单独的行,这是不错的做法吗?

或更好的方式来创建新表FreeTime东西像?

CREATE TABLE #FreeTime 
(
    Id INT IDENTITY, 
    UserId INT, 
    Description NVARCHAR(60) 
) 
+0

创建一个单独的表和链接表,这样,你只可以在休闲时光表只需插入新行,你可以在不改变模式 – Tanner

+0

链接东西了逗号分隔值不好的做法。正如您所说的,更好的方法是创建另一个表空闲时间来存储每个用户分隔的每个值。 – Kevin

回答

2

你快到了!如果你想要数据标准化,那么你需要3个表。

CREATE TABLE #User 
(
    Id INT IDENTITY, 
    Name NVARCHAR(60), 
    Email NVARCHAR(60), 
    Password NVARCHAR(60) 
) 

CREATE TABLE #FreeTime 
(
    Id INT IDENTITY, 
    Description NVARCHAR(60) 
) 

CREATE TABLE #UserFreeTime 
(
    UserId INT, 
    FreeTimeId INT 
) 

来自复选框的数据存储在#UserFreeTime表中。

+0

多一层(2桌)如果有多个问题 – Randy

+0

是的。这是我会做的。将删除我的答案。 – K7Buoy

+0

谢谢,那就是我所寻找的。 – Infinity

0

我会推荐一个简单的用户表:

CREATE TABLE #User 
(
    UserId INT IDENTITY, 
    Name NVARCHAR(255), 
    Email NVARCHAR(255), 
    Password varbinary(128) 
) 

然后复合键表:

CREATE TABLE #UserFreeTime 
(
    UserID INT NOT NULL, 
    FreeTimeID INT NOT NULL 
) 

和自由活动时间在一个单独的表名单:

CREATE TABLE #FreeTime 
(
    FreeTimeID INT IDENTITY(1,1), 
    Description NVARCHAR(50) 
) 
0

您可以使用两种方法实现此目的:

  1. 创建第二个表UserFreeTime类似如下:

    CREATE TABLE UserFreeTime 
    (
        Id INT IDENTITY, 
        UserId INT, 
        FreeTimeId, 
    ) 
    

    然后就像如果你使用的是C#代码中的定义枚举对每个选项:

    public enum { 
        Reading, 
        Traveling, 
        Sport 
    } 
    

    以上枚举会是你的FreeTimeId

  2. 在第二种方法中,您可以定义第三个表格,其中包括方法一中提到的上述两个表格。

    此表将具有以下结构:

    CREATE TABLE FreeTime 
    (
        Id INT IDENTITY, 
        FreeTimeDescription varchar(100), 
        IsActive bit, 
    ) 
    

    而不是使用枚举的,你可以存储在上表中你的空闲时间的喜好,可以在UserFreeTime表中引用其ID。希望它可以帮助

0

只给你一个选择,如果您的形式是永远,永远不会改变,然后添加额外的表其实只是试图设计灵活的东西,你真的不需要,或者尝试以满足“好设计”的原则而没有真正的好处。

这是最简单的解决方案:

CREATE TABLE #User 
(
    Id INT IDENTITY, 
    Name NVARCHAR(60), 
    Email NVARCHAR(60), 
    Password NVARCHAR(60), 
    FreeTime_Reading BIT, 
    FreeTime_Travelling BIT, 
    FreeTime_Sport BIT 
) 

我想很多人都不会这样的解决方案,但它是最简单的的发展,也为所有的报告,并会为它的最佳性能,只使用一张桌子。

0

干净的模型是TrustNo_1的建议有3个表(在关系表的其他人之间)。

理查德·汉塞尔和穆罕默德卡西姆提供了一个快速和肮脏的方式。

硬编码列重改变,但他们做的工作。

也schould考虑增加检查约束或触发器以防止错误的数据(如果有的话)。

对于为例,如果体育和读不能检查在一起:

CREATE TABLE #User 
(
    Id INT IDENTITY, 
    Name NVARCHAR(60), 
    Email NVARCHAR(60), 
    Password NVARCHAR(60), 
    FreeTime_Reading BIT CHECK (FreeTime_Reading + FreeTime_Sport <> 2), 
    FreeTime_Travelling BIT, 
    FreeTime_Sport BIT 
) 

不能使用,请与3台模型约束,你需要一个触发检查,如果体育记录存在和阅读更新和创造... ...