Oracle APEX(21.2)数据库设计-拆分数字与规范化

v8wbuo2f  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(130)

我知道这总体上是一个数据库设计问题,但我认为由于我正在考虑使用APEX_STRING.SPLIT_NUMBERS API实现的性质,将其与APEX一起列出是有效的。
有了这条路,我有一个同意书表,一旦创建将需要分配给不同的目标群体(例如学校金字塔、学校级别[高中、初中、小学]、年级级别[1-12],甚至是特定学校[通过学校ID])。可以针对多个金字塔(共5个),则对于给定的同意书,可以针对1个以上的学校(最多TP 10个)。
我最初的想法是创建一个包含所有这些目标组的表(以及相关的引用/查找表REF_PYRAMID,REF_SCHOOL_LEVEL,REF_SCHOOL)。然后将ID存储在相关列中作为数字列表(例如2:12:13)。然后,当我需要运行SQL检查以查看父母是否是授权目标的一部分并且应该有权访问同意书时,我将使用APEX_STRING.SPLIT_NUMBERS & MEMBER OF
我不习惯以这种方式存储信息,所以想知道这种方法是否有任何缺点?这使记录保持平坦,并允许选择在全校范围内制作同意书,这只是Y/N选项而不是多个目标,像其他人一样。

dpc_consent_form_target {
  target_id                 number         [primary key]
  consent_form_id           number         [ref: > dpc_consent_form.consent_form_id]
  school_wide               char(1)        [chk 'Y','N']
  pyramid_id                number
  school_id                 number
  school_level_id           number
  grade_id                  number
}

我的第二个想法是规范化设计,就像我通常会做的那样,这样每个学校都会在TARGET表中有自己的记录,但是我不确定如何最好地处理全校范围内的单个“记录”。

table dpc_consent_form_target {
  target_id                 number         [primary key]
  consent_form_id           number         [ref: > dpc_consent_form.consent_form_id]
  target_type_id            number         [ref: > dpc_ref_target_type.target_type_id]
  target_value_id           number
  created_by                varchar2(50)
  created_date              timestamp
  updated_by                varchar2(50)
  updated_date              timestamp
}

table dpc_ref_target_type {
  target_type_id            number         [primary key]
  target_type_name          varchar2(50)
  active_flag               char(1)
  created_by                varchar2(50)
  created_date              timestamp
  updated_by                varchar2(50)
  updated_date              timestamp
  deleted_by                varchar2(50)
  deleted_date              timestamp
}

TARGET TYPE VALUES:
1 - pyramid_id
2 - school_level_id
3 - school_id
4 - grade_id
5 - school_wide

提前感谢您的任何建议。

jc3wubiy

jc3wubiy1#

然后将这些ID作为一个数字列表存储在相关的列中(例如2:12:13)。
别这样
Apex连接RETURN值,例如Shuttle项目,在Apex世界中一切都很好 *。但是,一旦你走出它,必须基于这样的数据编写查询,你就必须将值拆分成行,以便你可以将它们连接到其他表。
它 * 行得通 *,可以做,没问题;然而,这不是实现它的方法,因为数据模型不是规范化的。而且,您不能在它上面创建任何有意义的索引,因为您将索引一个冒号分隔的字符串,而不是其中的每个值;当你有一个小的数据集时,性能没有什么不同,但是它会在大的数据集上受到影响。
怎么做?创建一个 * 子 * 表,它将通过外键约束引用它的主表。

相关问题