初学者试图设计和实现数据库

时间:2013-03-26 15:57:37

标签: database-design azure

首先,我对设计数据库相对较新,并且只使用有限的经验。换句话说....请放轻松跟我:)

我目前正处于开发数据库设计的初步阶段,我很快意识到我对设计的了解非常有限......但我知道这个过程将会有多重要。< / p>

时间在某种程度上是一个问题,虽然我感谢任何回答,'你应该读这本书来帮助你......',老实说,我没有时间去做;这是一个志愿者工作,在正常工作时间之外帮助退伍军人,这有望解释我缺乏经验。

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

只是为了向您提供我正在搜集一名士兵的信息片段:

  • 个人信息(姓名,团体编号,宗教信仰,出生地,近亲等)
  • 家庭成员(父母,子女,兄弟姐妹)
  • 教育历史(离校年龄,达到最高年级,大学/学院,行业/学徒,语言/书写语言等)
  • 职业史(以前的工作经历,雇主姓名,特定职业,出院后保证的工作,耕作经历等)
  • 病史(年龄,眼睛/头发颜色,身高,体重,肤色,疤痕,视力,听力等)
  • 体检(断骨史,既往头部受伤 - 脊柱疾病 - 破裂 - 肺结核 - 哮喘,血压,许多其他疾病等)
  • 军团历史(入伍日期,入伍时团,其他团加入,最高等级等)
  • 士兵的位置(士兵从出生,入伍,训练,战场,死亡的所有重要地点的列表)
    • 埋葬信息(死亡日期,死亡地点,墓地,墓地等)
显然,需要在一名士兵身上收集大量信息。我的问题是尝试决定如何以可管理和有效的方法拆分表,以及需要为每个表列出的主/外键。

  1. 认为会有一个巨大的桌子,每一排都是士兵似乎是不合逻辑的。
  2. 从逻辑上讲,也许我应该将数据库分解为上面列出的表格,但后来我不知道主键的用途是什么,因为它与每行大致相同的soldierID - 然后连接表格在一起(这对我来说似乎不对,因为它与#1不一样?)
  3. 将数据库分解为非常简单的表(即每个表的几列),它们指向彼此。示例:Language_Table,其中包含可能使用唯一ID进行说/写的所有语言的列表。这似乎是最有意义的,但会产生大量的表格。
  4. 请帮我设计一下。我将永远负债:)。

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

    提前感谢您提供给我的任何帮助/指示。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

让我们从士兵表开始吧。通常,表名是单数,以大写字母开头。您可以将此表中的每个项目放在士兵一次且仅出现一次此项目的位置。

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

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

那么,士兵会发生什么事情呢?

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

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

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

SoldierID是返回Soldier表的外键。

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

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

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

对于每件物品,你都会问自己,士兵和这件物品之间的关系是什么?

再举一个例子,让我们来看一个团。士兵和军团之间有什么关系?士兵可以属于一个或多个团。

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

祝你好运,并随意询问有关Stack Overflow的具体问题。

答案 2 :(得分:0)

我可以给你一个提示......给出的评论对你来说可能不是那么糟糕,但你也可以决定创建一个真正的数据库。你的问题是,这些信息特别关注一名士兵......但是,如果你能看到自给自足的信息,你就可以削减信息(就像你试图找到可以从阅读规范中演化出来的对象一样)。

在你的数据库中会有很多参考表...我给你举例:

宗教信息表,其中包含了今天所有已知的宗教信息,以及从此表到士兵表的链接。 (好的是,在你的士兵桌上,基督徒永远是基督徒,而不是曾经的基督徒,克里斯蒂安或克里斯蒂安......)

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

您可以添加一份包含员工姓名,开始日期,结束日期等的工作表。

或医疗文件: 咨询日期,医院(顺便提到参考),身高,体重,......

像这样的东西