1

我有一个表单可以动态生成组中的元素,所以我无法确定每次有人提交表单时我将提交多少内容到数据库。

Form
  -name
  -age
  -incident (0)
  -incident description (0)
  -incident (1)
  -incident description (1)
  -incident (2....)
  -incident descritpion (2....)

并且有大约 10 个可能的动态生成的表单元素组,所以我想我会为整个表单制作一张表格,并为动态生成的元素组按顺序制作一张表格。

formdata
name varchar(30)
age int(2)
incident0 sql
incdient1 sql

那可能吗?或者除了在我的表中创建一大堆我很少使用的列之外,还有其他方法吗?如果我创建一大堆列,是否会浪费内存,或者如果这些列中提交的数据不多,是否会有影响?

4

3 回答 3

8

您寻求的答案称为模式规范化,它是关系数据库管理系统的典型特征。Particular 概念称为“一对多”关系,其中您有一个与许多事件相关的“形式”。这是通过为事件设置一个表来实现的,该表中的一列是对表单表中 id 列的数字引用,因此每个事件“知道”它属于哪个表单。

FORMS
=======
id
name
age

INCIDENTS
============
id
form_id
descrition

然后 SQL 在选择时可以选择使用连接子句:

SELECT forms.name, incidents.description
FROM incidents
JOIN FORMS ON (incidents.form_id = forms.id)
于 2012-08-28T20:24:12.283 回答
2

如果有一天你不想有 10 个事件而是 20 个,你会改变你所有的代码吗?您应该以规范化的方式创建表。因此,您创建了两个表。

第一个表:表格(Form_id、姓名、年龄)

第二个表:事件(Incident_Id、Form_Id、描述)

于 2012-08-28T20:24:30.843 回答
1

标准 SQL 具有 ROW 类型和 MULTISET 类型。

MULTISET 在几乎所有方面都与 TABLE 相似/相同,尽管它们并不完全相同。

所以是的,标准 SQL 支持由行组成的表的概念,其中有一列(或更多)的值本身就是 MULTISET。

不要问我哪些可用的 SQL 产品有效地支持它 (*),或者如何与任何给定的 ORM 引擎样本中的这些列进行交互。

(*) 答案很可能是“根本没有”。一个支持这个特性的系统应该也支持 UNNEST 操作符(以及它的相反方向的对应物,它的名字卡在我的大脑和我的键盘之间的某个地方),但即使是像 DB2 这样的引擎似乎也不支持它。

于 2012-08-29T17:57:15.610 回答