Sql 复制长表单条目表的设计注意事项

Sql 复制长表单条目表的设计注意事项,sql,sql-server,database-design,Sql,Sql Server,Database Design,我目前正在将一个基于纸张的系统转换为一个新的门户网站。当公司(医疗机构)登记新患者时,患者当前填写的是一份特定表格。此表单包含28个问题,每个问题有多达20个不同的是/否选项 我的问题是,我应该创建一个包含许多列的表(可能多达300列,大部分包含位字段),还是应该以某种方式对其进行规范化 所有字段都与单个实体关联;病人来这里的原因 根据我的数据库设计经验,通常不赞成使用100+列的大型表,但我想看看社区对这个示例的看法。当使用许多布尔(BIT)字段时,有时最好使用单个INT字段,它是一个位和。这

我目前正在将一个基于纸张的系统转换为一个新的门户网站。当公司(医疗机构)登记新患者时,患者当前填写的是一份特定表格。此表单包含28个问题,每个问题有多达20个不同的是/否选项

我的问题是,我应该创建一个包含许多列的表(可能多达300列,大部分包含位字段),还是应该以某种方式对其进行规范化

所有字段都与单个实体关联;病人来这里的原因

根据我的数据库设计经验,通常不赞成使用100+列的大型表,但我想看看社区对这个示例的看法。

当使用许多布尔(
BIT
)字段时,有时最好使用单个
INT
字段,它是一个位和。这简化了存储和表定义,但使代码更加复杂。假设您有一个表,其中有一些不同含义的数值:服用药物、对扑热息痛过敏、糖尿病等。插入勾选字段时,只需将相应的数值相加即可。执行select语句时,您将按位进行比较:
TotalValue&Value=Value
。 下面是一些代码:

CREATE TABLE #Patients(Id INT, PatientName VARCHAR(50), MiscIssues INT)

DECLARE @IsOnMedication TINYINT = 2
DECLARE @IsParacetamolAllergic TINYINT = 4
DECLARE @IsDiabetic TINYINT = 8

INSERT INTO #Patients
VALUES
    (1, 'A', @IsDiabetic + @IsOnMedication)
    , (2, 'B', @IsDiabetic + @IsOnMedication + @IsParacetamolAllergic)

SELECT * FROM #Patients WHERE MiscIssues & @IsDiabetic = @IsDiabetic

DROP TABLE #Patients

另一种选择是使用自定义字段,但根据我的经验,当您有大量记录时,这种方法的性能很差。

这是一种有趣的方法。我认为“表单生成器”在某种程度上是不可避免的,但由于这是一个概念证明,我被允许将数据构建为静态数据,因此我喜欢你的按位操作概念。你需要搜索答案吗(即“给我以给定方式回答给定问题的患者”)?有几种版本的表单,是针对不同类型的患者还是随着时间的推移而改变?您是否期望将来需要管理表单修订?(我的医生办公室多年来一直使用一份表格询问“军人身份:单身、已婚、离婚、寡妇(er)”,直到我指出有些人婚姻幸福。)