sql - 数据库设计 : Store data from paper forms in database

标签 sql database

大家的数据库设计问题。我有一个表格(例如纸质表格),其中包含多个数据入口点。这种形式已经改变,并且预计会随着时间的推移而改变。它正在变成一个计算机应用程序,这样我们就可以停止浪费纸张。 (还有一些小事,比如将所有数据都放在一个可以查询的中央存储中,等等)我想将所有表单数据存储在一个数据库中,并且让它对更改完全不可知。

最初,我只是将每个字段视为一个字符串——我有一个类似这样的表:

FormId int (FK)
FieldName nvarchar(64)
FieldValue nvarchar(128)

...类似的东西。它实际上更符合 3NFy,因为 FieldName 在另一个表中,与人工键相关联,因此字段名称不会到处重复。

但是,我想将其扩展到数字和下拉数据。我可以将数字数据存储为字符串,但这似乎是一个非常糟糕的想法。与下拉菜单相同。

我可以停止使用表格,而实际上使用主表格表格(上面的 FormId 引用的表格)上的列,但这意味着为每个新项目添加一列,而旧表格将只是空的. (而且,除非我存储它,否则我不知道该列是何时创建的。对于上面的字符串表,它是隐式的。)

我可以将上面的表格扩展为:

FormId int (FK)
FieldName nvarchar(64)
FieldValueType int -- enum as to which of the columns below are valid (or just let nulls imply that)
FieldValue nvarchar(128)
FieldValueInt int

组合必须在 OTLT(一个真正的查找表)中,我对此持保留意见,但也许这里需要它?

对 StackOverflow 有什么建议吗?我正在使用 MSSQL,但这确实是一个更普遍的问题。

最佳答案

使用空值。适当的数据库设计是一个复杂的主题;你最好找一个好的引用资料并对整个事情做一些研究(我认为 this 是一本关于这个主题的好书)。一般来说,从一个封装表单中所有字段的单个表开始,然后将其通过规范化过程,听起来您会得到很好的服务。是的,使用空值并且不要使用 int 来枚举哪些列被设置为有效值;这正是 null 的用途。

关于sql - 数据库设计 : Store data from paper forms in database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129451/

相关文章:

SQL 语法不正确 'GO' 附近

python - Django 和只读数据库连接

sql-server - 在 Visual Studio 中拥有数据库项目后,如果我编辑存储过程或 View ,我该如何将更改应用到服务器?

mysql - 为什么我无法在 Sequelize 中保存具有不同列值的多对多表?

sql - 如何在 GROUP BY 子句中添加 XML 数据类型?

mysql - SQL 包含相关表中 id 不存在的结果

php - 避免在插入手动递增的收据编号时发生冲突

mysql - 如何将以下 MySQL 模式转换为 CouchDB?

mysql - 加入一张 table 2 次

mysql - 每个组中满足条件的一个条目的sql