Database design 在数据库中创建不是真正外键的外键可以吗?

Database design 在数据库中创建不是真正外键的外键可以吗?,database-design,foreign-keys,Database Design,Foreign Keys,我有一个模拟数据库: 用户: 用户ID 公司: 公司id 用户id 特许经营权: 特许经营权 公司id 商店: 商店标识 特许经营权 这些都是主键和外键 我想知道的是,把用户id放在特许经营表中这样的做法是否不好 这样我就可以在没有任何关系的情况下进行报道,而且万一有什么东西“丢失”了,我可以找到它去了哪里。它们不是数据库中定义的外键,但看起来像外键。还是我应该给他们做外键 谢谢你的意见 编辑:我还认为,像我所想的那样去规范化可能有助于加快速度,而不必使用所有的连接。您所说的是计

我有一个模拟数据库:

用户:

  • 用户ID
公司:

  • 公司id
  • 用户id
特许经营权:

  • 特许经营权
  • 公司id
商店:

  • 商店标识
  • 特许经营权
这些都是主键和外键

我想知道的是,把用户id放在特许经营表中这样的做法是否不好

这样我就可以在没有任何关系的情况下进行报道,而且万一有什么东西“丢失”了,我可以找到它去了哪里。它们不是数据库中定义的外键,但看起来像外键。还是我应该给他们做外键

谢谢你的意见


编辑:我还认为,像我所想的那样去规范化可能有助于加快速度,而不必使用所有的连接。

您所说的是计划中的数据去规范化。您最好创建访问表的报告视图。这样,您就不必更改表及其完整性(或存储冗余),但仍然可以在报告中使用关联。

您所说的是计划中的数据非规范化。最好创建视图以报告访问表。这样,您就不必更改表及其完整性(或存储冗余),但仍然可以在报告中使用关联。

我知道您在做什么。对我来说,你现在拥有的一切都是完美的;您不需要在特许经营中添加额外的字段“user\u id”。因为用户与公司有关系,公司与特许经营有关系;用户确实与特许经营有关联


您可能希望创建一个视图来显示所有内容,而不是向表中添加一个额外的字段。

我知道您在做什么。对我来说,你现在拥有的一切都是完美的;您不需要在特许经营中添加额外的字段“user\u id”。因为用户与公司有关系,公司与特许经营有关系;用户确实与特许经营有关联


您可能希望创建一个视图来显示所有内容,而不是向表中添加一个额外的字段。

外键应该可以防止内容“丢失”。这样会增加数据不一致的可能性,而不会增加任何附加值。@iDevlop它是如何增加数据不一致的可能性的?看起来这会降低它。无论在哪里添加可传递依赖项,都会增加不一致的风险,因为修改一个表中的用户id需要在另一个表中更改它以保持一致性。干的(不要重复你自己)。我会听从TIHan的建议。外键应该是用来防止东西“丢失”的。你增加了不一致数据的几率,但没有附加值。@iDevlop它是如何增加不一致数据的几率的?看起来这会降低它。无论在哪里添加可传递依赖项,都会增加不一致的风险,因为修改一个表中的用户id需要在另一个表中更改它以保持一致性。干的(不要重复你自己)。我会听从TIHan的建议。是的,但是如果你遵循规范化规则,那么在特许经营表中存储用户id是多余的,而且它可能会导致“更新异常”,或者我被告知。我同意,这就是我所说的。他目前拥有的特许经营权没有用户id,但他问他是否应该在特许经营权中添加用户id,这是一种不好的做法。哦,你的意思是他拥有的一切都很好……就像“不要在特许经营权中添加用户id”,而不是相反。明白了。是的,但是如果你遵循规范化规则,那么在特许经营表中存储用户id是多余的,而且它可能会导致“更新异常”,或者我被告知。我同意,这就是我所说的。他目前拥有的特许经营权没有用户id,但他问他是否应该在特许经营权中添加用户id,这是一种不好的做法。哦,你的意思是他拥有的一切都很好……就像“不要在特许经营权中添加用户id”,而不是相反。明白了。@johny:JOIN并不一定是坏的-如果你在所有外键上都放置了非聚集索引columns@johnny:JOIN不一定是坏的-如果在所有外键列上放置非聚集索引