Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 哪种数据库设计更好?_Sql_Database_Database Design_Data Modeling - Fatal编程技术网

Sql 哪种数据库设计更好?

Sql 哪种数据库设计更好?,sql,database,database-design,data-modeling,Sql,Database,Database Design,Data Modeling,我将创建一个数据库来跟踪举重练习 你喜欢哪种方法 解决方案A: 两张桌子 练习(带ID、姓名等) 设置(带有ID、设置编号、日期、FK\U练习) 这里,一个练习和集合具有一对多的关系。 Set\u编号应跟踪给定日期的设置(第一套、第二套、第三套等) 优点:少处理一张桌子 解决方案B: 三张表: 练习(带ID、姓名等) 会话(带ID、日期、FK_练习) Set(带ID、Set_编号、FK_会话) 在这里,会话类似于练习和设置之间的连接器。因此,基本上,在给定的一天,给定练习的一系列集合将汇

我将创建一个数据库来跟踪举重练习

你喜欢哪种方法

解决方案A:

两张桌子

  • 练习(带ID、姓名等)
  • 设置(带有ID、设置编号、日期、FK\U练习)
这里,一个
练习
集合
具有一对多的关系。
Set\u编号
应跟踪给定日期的设置(第一套、第二套、第三套等)

优点:少处理一张桌子

解决方案B:

三张表:

  • 练习(带ID、姓名等)
  • 会话(带ID、日期、FK_练习)
  • Set(带ID、Set_编号、FK_会话)
在这里,
会话
类似于
练习
设置
之间的连接器。因此,基本上,在给定的一天,给定练习的一系列集合将汇集到一个
会话
实例中。 在这种情况下,
练习
会话
具有一对多关系,
会话
设置
也具有一对多关系


优点:Date属性对于任何给定的日期都不会是多余的。从逻辑上讲,捆绑集合是有意义的。

一个好的数据模型来自于对领域的正确理解。您的域有三个实体:

  • 练习:特定类型的举重动作(名称和重量)
  • 设定:给定运动的重复次数(取决于训练目标-力量、肌肉、耐力?)
  • 会话:在给定日期进行的集数
所以你至少需要三张桌子。至少,因为运动有两个细节层次:一个是运动名称,另一个是运动重量。很可能您需要存储不同名称和重量组合的集合(
Bicep curl/10kg
Bicep curl/15kg
,等等),在这种情况下,您需要一个查找表练习名称和第四个表练习集合来存储用于特定一组重复的重量

通过这个练习(呵呵!)我们可以看出您的外键是错误的。一次会议由若干组组成;一套包括许多练习(套路练习)

因此,逻辑数据模型应该如下所示:

  • 运动(ID、姓名、体重等)
  • 设置(ID、FK_练习、重复等)
  • 会话(ID、FK_集、日期等)
虽然这并不十分准确:SET:SESSION实际上是一种多对多关系,因为一个会话通常包含多个SET,并且一个SET可以在多个会话中完成

对于物理数据模型,即表,您应该有五个表:

  • 练习(ID、姓名等)
  • 设置运动(ID、FK\U运动、FK\U设置、重量等)
  • 设置(ID、FK\U设置\U练习、重复等)
  • 会话集合(FK集合、FK集合、集合编号等)
  • 会话(ID、日期等)
SESSION_SET表是解决SET和SESSION之间的多对多关系所必需的

最终的模型有五个表:三个表用于原始实体,两个交叉表用于连接这些实体。逻辑实体(练习、集合、会话)之间的所有关系都被实现为交集表,而不是外键。当从逻辑数据模型转换为物理数据模型时,这种情况并不总是发生


这不是对领域建模的唯一方法。作为一项设计活动,数据建模即将适合您需要记录的数据。数据是起点

“关于会话实体,我似乎没有说清楚……他的命名可能是错误的和误导性的”

这就是为什么我说数据模型基于对领域的正确理解。练习、设置和会话是域术语。当然,欢迎您为您的私人项目定义自己的事物,但在现实生活中,数据模型是开发和业务之间交流的一种机制:事物的含义至关重要,并且必须符合共识。我们无法构建一个数据模型,其中会话的含义与业务部门对“会话”的理解不同

“我也不明白如何在多个会话中完成一组任务?”

一套是一系列重复练习的模式。因此,
#1/benchpress/130KG/8次
是一套,而
#2/benchpress/100KG/12次
是另一套。如果你在星期一和星期三做了八次130公斤的长距离卧推,那么在两次不同的训练中也是一样的。也许这是一个细节层太远;但是,如果你要建立一个数据库应用程序来跟踪你的训练,而不是像大多数人那样使用电子表格,那么你最好建立一个最好的数据模型:-)


再一次,数据建模是一个有大量意见的练习:如果您的数据模型足以满足您当前的需求,那么它就足够了。问题是,更严格的数据模型反而更灵活(因为强制执行数据完整性规则可以更容易地编写查询并确保结果正确)。现在可能足够好的东西可能会严重阻碍未来的创新。

请提供样本数据。一套练习可以包含多个练习吗?什么是会话?它由多个集合组成吗?重要吗(它不在第一个数据模型中)?从尽可能多地确定业务需求开始,然后设计数据库以满足这些需求。@GordonLinoff:Question-edited。现在更好了吗?“一张桌子没法处理”不是我认为是一个优势。你必须提供两件事:依赖关系和你想要达到的标准化水平。不要掉入查看表中可能包含的数据的陷阱