首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GUID将多个表链接到同一个Id字段是否被认为是良好的SQL实践?

使用GUID将多个表链接到同一个Id字段是否被认为是良好的SQL实践?
EN

Software Engineering用户
提问于 2012-11-13 01:23:31
回答 5查看 7.3K关注 0票数 2

我想将几个表链接到多对多(M2m)表。

一个表将被称为location,此表将始终位于m2m表的一侧。

但我将列出几个表,例如:

  • 卡片
  • 照片
  • 插图
  • 向量

在这些表之间使用GUID将其链接到另一个表中的单个列是否被视为“良好实践”?Mysql会让我自动级联更新和删除吗?如果是这样的话,多重级联会不会导致问题?

更新

我读过GUID (一个十六进制数字),它通常占用数据库中更多的空间,减缓查询的速度。不过,我仍然可以生成“唯一”id,方法是将表首字母s作为id的一部分,这样表卡的id将为c0001,然后插图为I001。不管这一变化如何,问题仍然存在。

EN

回答 5

Software Engineering用户

回答已采纳

发布于 2012-11-13 02:34:35

默认情况下,数据库不支持这种关系(正如您绘制的那样)。我以前使用过它,但没有强制使用多个不同表的外键。我必须处理代码中的所有关系。一般认为这是个坏主意。

“正确”的方法是有一个CardLocationPhotographLocation等表,每个表都有自己的Guid主键(例如CardLocationId)。如果您碰巧需要在每个关系上挂起公共数据,那么您将创建另一个名为LocationRelationship的表,并使关系表的主键(例如,CardLocationId)也成为引用LocationRelationshipId的外键。因此,CardLocation中的每个记录在LocationRelationship中都有相应的记录。这样,您就可以强制执行关系数据库中的所有关系。不幸的是,事情要复杂得多。

编辑

经过更多的思考后,另一种方法是让CardPhotograph等从一个公共基础派生出来(让我们称之为Locatable)。因此,您可以创建一个名为Locatable的新表,其中包含主键LocatableId。那么CardId既是主键,也应该是引用LocatableId的外键,PhotographId也是LocatableId的外键。然后,您只有一个名为LocatableLocation的多对多表,其中包含指向LocatableIdLocationId的外键。

这是较少的表,似乎意味着意图更好。

票数 4
EN

Software Engineering用户

发布于 2012-11-13 03:00:08

我对你目前的数据模型有评论。

1-你应该有一个单独的m-m的每个关系,而不是像你目前在模型中显示的一个表。一个原因是m表的出现可能是一个或多个FK值。级联删除可能会删除may表中保存不想删除的FK值的几行。

2-你的关系,从一方到连接表,可能是可选的,从一方,而不是强制性的,因为你的模型。可选关系会导致创建一个可为空的FK,这将通过删除非空值并将其替换为null (如果这是您想要的话)来防止级联发生。

3-从m到Location表的关系可能不应该是强制性的,因为这会删除卡片删除上的位置。您可能希望这是可选的(见上文2)。

你真的需要m-m?真的吗?你的生意从问题上还不清楚,但也许你只需要一米。在你建立模型之前,先用一个例子来证明给自己看。

5-通过创建一个带有类型列的资源表,您可能会避免拥有4个可能具有相同列的表。类型是:卡片,插图,等等。这样你就可以保存3张表和3张连接表。

6-使用复数表名是不好的。微软曾经这样做过,但这并不好!更喜欢单数表名。复数名称有利于命名集合。

现在,根据您关于GUID的问题,您可以使用GUID,但这将使测试变得非常困难。如果GUID是您系统中的一个预期函数,它还会使使用GUID查找行成为用户的噩梦。大型数据库的性能可能会受到影响。考虑在可能的情况下使用int类型。将Horor - GUID编码为PK Pros Pros和Cons

票数 2
EN

Software Engineering用户

发布于 2012-11-13 01:54:36

GUID通常表示为十六进制字符串,但如果空间是考虑因素,则更适合以二进制格式(而不是varchar)存储;通常是在RDBMS中。

使用GUID作为外键或主键没有任何问题。如果您确保您的表有正确的索引,那么它根本不应该影响性能。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/175635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档