我需要将非关系数据库迁移到关系数据库。非关系数据库包含带有数据的M表Oi。一些数据表Oi具有包含原始元素阵列的字段(单元)。数组可以是不同的数字类型和维度,但所有数组都可以存储为双精度数组(4字节int和float可以转换为双重可逆)。关系数据库将包含这些M数据表以及包含模式的附加表和一个 N 表,其中包含所有 M表的数组数据(但每个数组应该有单独的行)元件)。换句话说,要在关系数据库中表示数组,我将为表格 Oi 中的原始单元格关联的数组数据引入新表 N 。将有一个表N将包含所有表O1,O2,... Oi,... OM的数组数据。为了全面了解我提到的架构表,但似乎它们并不重要。
有两种选择:
表Oi(1< = i< = M)(名称为APK)和列:
表N包含列:
具有列的表Oi(1 <= i <= M):
表N包含列:
注意:APK是一个大约100个字符的字符串,第一个选项重复APK太多了。也许值得为每个APK字符串添加一个别名 - 整数ID ...数组的语义是未知的 - 时间限制非常困难。表的数量和种类很大。这个数据库是模式 - 将有几十个这样的数据库。因此,主要目标是加速开发(一个表N是快速而简单的解决方案)。其他目标是能够使用SQL来选择每个数组元素而无需命令式编程。此表存储用于测试其他数据的数据,因此QA应该可以轻松访问数据。哪个选项更好 - 或者有任何建议吗?
答案 0 :(得分:0)
几点。
首先,只要您实际建模的数据非常适合数学矩阵,数组就不一定会破坏1NF。换句话说,位置很重要,阵列在所有维度上都有固定的大小等。因此,您还没有提供足够的信息来说明是否需要将其关闭以进行规范化。
例如,如果我将IP地址表示为&#39; 127.0.0.1&#39;或者作为ARRAY [127,0,0,1],两种方法都不会破坏1NF。因此,这是从数据模型开始而不是先验排除数组的一个原因。
其次,您需要确保表中的函数关系是常量。通常语义是这里的代理,但在进一步研究之前,通常最好先查看实际的函数依赖。行代表什么(第一个问题是语义)?行中的功能依赖是什么?
这些问题将指导您的设计,而不是根据您当前的详细程度获得的任何答案。
答案 1 :(得分:0)
根据你对我评论的回应,我会识别出数组可以代表的所有不同类型的事物(无论是在意义方面,还是像@Chris Travers所说的那样,与其他事物的关系)。然后每种事物都有一个表,并且每个嵌套数组的成员都有一行。
然后对其他表执行外键(包含最初嵌套数组的数据的新表)。
所以,如果嵌套数组可能是Dogs and Ships的id(例如),其余的数据是在新表O1到O22中(希望你有更好的名字):
<强>狗强>
<强>船舶强>
<强> O1 强>
等等
<强> O22 强>
WasNestedArray (请提出一个更好的名字!)
所以当你遇到一个新的嵌套数组时:
它是polymorphic association的一个实例,由于你有很多源表(O1到ON)而不是单个源表,因此更加复杂。
所有这些都假定没有重复,例如在各种嵌套数组中发布。你可能有点hacky并且在Ship等表中有重复(通过不同的id)或者放置一层WasNestedArrayHasShip,WasNestedArrayHasDog等表来解决多对多的关系。