0

我正处于开发数据库设计的初步阶段。

这是我的困境:我目前已经概述了大约 150 多个需要在数据库中输入的字段,但是我很难决定如何将这些字段分解为链接在一起的有效表,这遵循常规的规范化规则。

只是给你一个我收集的关于一个士兵的信息片段:

  • 个人信息(姓名、团号、宗教、出生地、近亲等)
  • 家庭成员(父母、子女、兄弟姐妹)
  • 教育历史(离开学校时的年龄、达到的最高年级、学院/大学、行业/学徒、口语/书面语言等)
  • 职业经历(以前的工作经历、雇主名称、具体职业、出院后保证的工作、农业经验等)
  • 病史(年龄、眼睛/头发颜色、身高、体重、肤色、疤痕、视力、听力等)
  • 体格检查(骨折史、以前的头部受伤-脊髓问题-破裂-肺结核-哮喘、血压、许多其他情况等)
  • 团历史(入伍日期、入伍时的团、加入的其他团、最高军衔等)
  • 士兵的位置(士兵从出生、入伍、训练、战场、死亡到过的所有重要位置的列表)
  • 埋葬信息(死亡日期、死亡地点、墓地、墓地等)

显然,需要收集关于单个士兵的大量信息。我的问题是试图决定如何以一种可管理且有效的方法拆分表,以及需要为每个表列出的主键/外键。

  1. 认为会有一张巨大的桌子,每排都是士兵似乎是不合逻辑的。
  2. 从逻辑上讲,也许我应该将数据库分解为上面列出的表,但是我不知道主键使用什么,因为每一行的战士ID 大致相同——然后将表连接在一起(即对我来说似乎不对,因为它与#1 不一样吗?)
  3. 将数据库分解为相互指向的非常简单的表(即每个表有几列)。示例:Language_Table,其中列出了所有可能说/写的语言,每种语言都有一个唯一的 id。这似乎是最有意义的,但会创建大量表。

该计划还将在 Azure 上托管数据库,最终将馈入 Windows Phone 应用程序。

4

3 回答 3

1

不想扔太多曲线球,但您是否考虑过使用文档数据库,比如 RavenDb?它可以让您轻松地将所有这些信息保存在单个文档中,因为它们都与单个士兵相关,因此尝试将其拆分为相关表格感觉相当随意。这是与士兵有关的所有元数据,因此将其存储在一起以针对单个士兵记录。

作为第一步,我将专注于设计您的域模型,以准确映射您希望记录的有关士兵的数据,如您的问题中所述。完成此操作后,请考虑如何将其映射到您选择的数据存储。

于 2013-03-26T16:04:59.287 回答
1

您要做的是标准化士兵的信息。阅读我链接的维基百科文章是关于我可以提供的简明解释。通过规范数据项的关系,您可以将此信息存储在关系数据库中。

让我们从一张士兵桌开始。通常,表名是单数的,并且以大写字母开头。您将把每个项目都放在这个表中,士兵只有一次出现这个项目。

符合此标准的一些项目是:姓名、出生地点、出生日期、死亡日期、死亡地点、埋葬地点等。

该表可以根据需要包含任意数量的项目(列)。唯一的标准是每个项目出现一次。

那么,一个士兵拥有不止一个东西会发生什么?

让我们以家庭成员为例。FamilyMember 表可能如下所示:

FamilyMember
------------
FamilyMemberID
SoldierID
FamilyMemberType
FamilyMemberName
...

FamilyMemberID 是 FamilyMember 表的主(集群)键。它是一个自动递增的整数或长整数,可为表提供唯一键。

SoldierID 是返回到 Soldier 表的外键。

FamilyMemberType 描述了家庭成员和士兵之间的关系。一些例子是父母、兄弟、姐妹等。通常,您会保存一个代码(P 代表父母,B 代表兄弟,S 代表姐妹)而不是文本。

其余列描述家庭成员。这些列代表家庭成员的一次且仅一次出现。

您对要保存在关系数据库中的所有数据项执行此操作。

对于每一个物品,你都会问自己,一个士兵和这个物品有什么关系?

再举一个例子,我们来看一个团。士兵和团是什么关系?一名士兵可以属于一个或多个团。

因此,您的 Regiment 表的结构类似于 FamilyMember 表。

于 2013-03-26T16:17:14.107 回答
0

我也许可以给你一个提示......给出的评论可能对你来说不是那么糟糕,但你也可以决定创建一个真正的数据库。您的问题是信息特别涉及士兵……但是,如果您可以看到自给自足的信息,则可以剪切信息(就像您尝试找到可以从阅读规范中进化而来的对象时一样)。

在您的数据库中会有相当多的参考表......我给你举个例子:

一个宗教表,其中包含当今已知的所有宗教,以及从该表到士兵表的链接。(好消息是在你的士兵表中,基督徒总是基督徒,而不是曾经的基督徒、克里斯蒂安或克里斯蒂安……)

然后你必须找到这个特殊的对象:示例:工作

您可以添加一个工作表,其中包含员工姓名、开始日期、结束日期......

或医疗文件:就诊日期、医院(顺便提一下)、身高、体重……

类似的东西

于 2013-03-26T16:23:07.377 回答