【问题标题】:MS SQL Table structure for dynamic app动态应用程序的 MS SQL 表结构
【发布时间】:2015-04-03 06:24:26
【问题描述】:

我正在构建一个动态应用程序。

应用程序的基本功能是我可以创建一个问题。一个问题可能有很多列。这些列将显示在表格结构中。然后用户将填写详细信息。以下是示例。

问题: 1. 列出可用的项目及其截止日期?

列: 1. 项目 - 文本框 2. 截止日期 - 文本框

所以我将在下表中显示这些数据。

用户将填写该行并单击提交按钮。将添加另一个空行以添加另一个响应,如下所示。

用户将提交任何回复。

像这样,列数将是动态的,并且每列都会有一些验证,如 Unique、AcceptsNull 等...

如何在 ms sql server 中创建表结构来保存问题、列和响应。

请帮忙提前谢谢..

【问题讨论】:

    标签: c# mysql sql-server


    【解决方案1】:

    您的方案类似于Microsoft Project Server 将其数据存储在MSSQL 中的方式。在每个项目的 MSPE 中,任务可以具有动态数量的列。在您的情况下,如果您可以将所有列类型设为VARCHAR,那么您的场景会更加简单。

    建议的结构是这样的:

    这是有问题的表格:

    tbl_Questions

    +------------------------------------------------------------------+
    | Id          | Question                                           |
    +----------------------------------------------------------------- +
    | RandomGUID1 | "List the projects available and their deadlines?" |
    | RandomGUID2 | "List the projects available?"                     |
    +------------------------------------------------------------------+
    

    tbl_RelationTable

    +---------------------------------------------------------------------------+
    | Id     | QuestionId  | Column1        | Column2       | ... |Column 1000  |
    +---------------------------------------------------------------------------+
    |      1 | RandomGUID1 | RandomGUID111  | RandomGUID112 |     | null        |
    |      2 | RandomGUID2 | RandomGUID113  | null          |     | null        |
    +---------------------------------------------------------------------------+
    

    在此表中,您存储 tbl_Questions 与其他表之间的所有关系。您在此表中定义了足够数量的列,这里我建议 1000,但在您的情况下,10-15 列可能就足够了。一个重要方面是您需要为问题 ID 使用 GUID 才能唯一。

    现在我们定义真实的数据表。 这是您定义答案列的表格:

    tbl_AnswerColumns

    +-----------------------------------------------+
    |Id| RelationTableId | QuestionId  | ColumnName |
    +-----------------------------------------------+
    | 1| RandomGUID111   | RandomGUID1 | Title      |
    | 2| RandomGUID112   | RandomGUID1 | Answer     |
    | 3| RandomGUID113   | RandomGUID2 | Title      |
    +-----------------------------------------------+
    

    这是您存储答案值的表:

    tbl_AnswerValues

    +-----------------------------------------------+
    |Id| RelationTableId | QuestionId  | Answer     |
    +-----------------------------------------------+
    | 1| RandomGUID111   | RandomGUID1 | "Answer1"  |
    | 2| RandomGUID112   | RandomGUID1 | "Answer2"  |
    | 3| RandomGUID113   | RandomGUID2 | "Answer3"  |
    +-----------------------------------------------+
    

    您需要在所有表中定义外键,以使数据检索更快。这就是为什么每个表都应该包含 QuestionId 的外键。

    【讨论】:

    • 每一列都有特定的属性。就像第 1 列将是文本框,而第 2 列将是下拉菜单。您将把这些信息保存在哪里
    • 您可以在tbl_AnswerColumns中添加一个新列:ColumnType,同样对于dropDown,您可以添加另一个带有PossibleValues的列。
    【解决方案2】:

    根据你提供的信息,我在想这样的事情吗?

    Questions       
    +---------------------------------------------------------+
    | Id | Question                                           |
    +----+--------------------------------------------------- +
    |  1 | "List the projects available and their deadlines?" |
    +---------------------------------------------------------+
    
    Answers
    +-----------------------------------------------------------------------------------+
    | Id | QuestionId | Order | Title      | Anwser      | Unique | Nullable | Values   |
    +----+------------+-------+------------+-------------+--------+----------+----------+
    |  1 |          1 |     0 | "Project"  | "Project 1" |   True |    False | "P1, P2" |
    |  2 |          1 |     1 | "Deadline" | "Apr-15"    |  False |     True | NULL     |
    +-----------------------------------------------------------------------------------+
    

    编辑:我已经添加了验证。如果您希望对同一问题的所有答案进行相同的验证,您还可以将验证列移动到问题表中。

    【讨论】:

    • 有多个回答可供提问。你将如何处理它?
    • 通过在 awsers-table 中添加具有相同 QuestionId 的新记录。
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多