首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >困惑于如何在我的场景中应用外键概念

困惑于如何在我的场景中应用外键概念
EN

Stack Overflow用户
提问于 2015-08-18 08:47:38
回答 2查看 346关注 0票数 3

我有一个名为收据的数据库表,如下所示:

立柱

  • 付款
  • 发票
  • custom_field
  • 组织

是分开的表

约束条件是,对于每个收据,不能超过来自上述的任何一个。这意味着每个收据将有一个付款条目,一个发票条目,一个custom_field和组织条目。

现在,我认为可以去掉上面提到的所有列名,而是将_id作为接收表的主键,而将_id与所有其他表的外键相关联。

在上面的结构中,我也很困惑,如果我遵循上面的结构,我应该如何为-支付-发票- custom_field -组织生成唯一的值。但是,如果我选择了后面的,主键和外键将是自动生成和唯一的。我也很关心编辑。你有什么建议吗?

以下是我的结构:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 09:50:25

乔迪是对的,他说得对。只是我不认为有很多-许多关系适用于最初的问题,因为它说“在那里不能不止一个.”

约束条件是,对于每一份收据,以上任何一份都不能超过一份。这意味着每个收据将有一个付款条目,一个发票条目,一个custom_field和组织条目。

因此,对于每一份收据:

  • 一笔钱。
  • 一张发票。
  • 一个自定义字段
  • 以此类推,收据表的“分机”数量随您的需要而定。

如果我的理解正确的话,你可以在纯理论中把所有这些列放在一个“大”表中,其中有许多列,这当然在实践中是丑陋和糟糕的,因为其他的原因都是离题的。但是请注意,如果您只有一个表,那么您将拥有相同的主键,这似乎是您所要求的,但也是您可能并不真正想要的。

如果你想把这样的“只有一个大表”变成收据,发票,定制字段等等.然后,收据表将有一个主键(假设'ID')以及任何‘扩展’,子表将有他们的主键(也可以说'ID‘)。

所以我们去:

Receipt.ID,Invoice.ID,CustomFields.ID,Payment.ID等等。

请记住,所有这些in在收据方面都是独立的。Invoice.ID和Receipt.ID是,在任何方面都不需要成为相同的

要将其中任何一个子类绑定到其父“收据”,您需要的是一个专用的列(比方说'ReceiptID'),该列的外键指向Receipt.ID。

现在,作为最后一步,如果您在子表中为ReceiptID定义了唯一的键或唯一索引,它将确保对任何给定的收据最多有1次付款,最多1次发票等等。

例如,如果您将来需要为您的收据获取多个自定义字段,或者需要获得多个支付信息,则只需将定制字段表中的唯一约束更改为一个简单的非唯一索引即可完成。

因为名声不好我不能发照片。我希望我能阐明我的观点。

票数 2
EN

Stack Overflow用户

发布于 2015-08-18 08:58:24

约束条件是,对于每个收据,不能超过一个以上的任何一个。

我的错因为快速阅读。

更新:一对多

这里有一个ONE-TO-MANY relationship,所以一个简单的收据可以来自0 (或者1?)表之间的强制性是否与receipt相关?)与N相关的userspaymentorganization等。

注意:如果您只能为每个用户提供一张收据:11,您将需要一个http://www.databaseprimer.com/pages/relationship_1to1/

如何解决?

您必须改变您的愿景,在receipt表中有外键,其他表中必须有外键。

代码语言:javascript
复制
user
|-- id
|-- email
|-- other attributes
|-- receipt_id   // foreign key refering to a single receipt.

那么您的用户表将有额外的字段,

代码语言:javascript
复制
user_id email     .....   receipt_id
1       a@a.com   others  1
2       b@b.com   others  1
3       c@c.com   others  2

您可以执行以下选择:

代码语言:javascript
复制
SELECT * FROM USERS WHERE receipt_id = 1

产出:

代码语言:javascript
复制
1       a@a.com   others  1
2       b@b.com   others  1

联接查询(选择接收并获取所有用户关联):

代码语言:javascript
复制
SELECT * from receipt r JOIN user u where r.id = u.receipt_id; 

多对多

这意味着您需要一个连接表来映射多对多关系

让我们向用户解释:

一个菜谱可以引用多个用户(实际上,不同的用户可以访问此菜谱,也可以使用不同的用户编写此菜谱)。

您将需要一个只有两个字段的表recipe_users --两个字段都是外键

代码语言:javascript
复制
recipe_users
|---- recipe_id    // FK of recipe table
|---- user_id      // FK of user table

然后,您可以向不同的用户推荐一个菜谱。

代码语言:javascript
复制
recipe_id    user_id
1            1
1            2 
1            3

或者为每个用户提供你想要的多少菜谱,

代码语言:javascript
复制
recipe_id    user_id
1            1
2            1 
3            1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32067708

复制
相关文章

相似问题

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