【问题标题】:Is it possible to have a SQL table within an SQL table? (for dynamically generated forms)SQL 表中是否可以有一个 SQL 表? (对于动态生成的表格)
【发布时间】:2012-08-23 09:52:27
【问题描述】:

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

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

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

【问题讨论】:

  • 数据库是指表吗?
  • 数据库是指表,你使用什么dbms? MySQL、SQL-Server、Oracle?
  • 是的,我的意思是表对不起,我使用 MySQL。
  • 是的,您可以在 MySQL 数据库中添加任意数量的表。
  • 答案是找到一个可以表达普通表格中的表单字段的逻辑数据结构。不是表中的表。

标签: php sql database database-design normalization


【解决方案1】:

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

FORMS
=======
id
name
age

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

那么SQL在选择时可以选择使用join子句:

SELECT forms.name, incidents.description
FROM incidents
JOIN FORMS ON (incidents.form_id = forms.id)

【讨论】:

  • 啊..这似乎是这样做的方法..我会研究模式规范化的mroe,谢谢。
  • 不客气。您对未使用的列感到好奇是对的。这是规范化的经验法则之一。架构中的每一列都应该只用于一条有意义的信息(不为零也不多于一)。标准化有多个“级别”...欢迎来到我最喜欢的开发之旅之一!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 2018-09-11
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多