您的方案类似于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 的外键。