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

立柱
是分开的表
约束条件是,对于每个收据,不能超过来自上述的任何一个。这意味着每个收据将有一个付款条目,一个发票条目,一个custom_field和组织条目。
现在,我认为可以去掉上面提到的所有列名,而是将_id作为接收表的主键,而将_id与所有其他表的外键相关联。
在上面的结构中,我也很困惑,如果我遵循上面的结构,我应该如何为-支付-发票- custom_field -组织生成唯一的值。但是,如果我选择了后面的,主键和外键将是自动生成和唯一的。我也很关心编辑。你有什么建议吗?
以下是我的结构:

发布于 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次发票等等。
例如,如果您将来需要为您的收据获取多个自定义字段,或者需要获得多个支付信息,则只需将定制字段表中的唯一约束更改为一个简单的非唯一索引即可完成。
因为名声不好我不能发照片。我希望我能阐明我的观点。
发布于 2015-08-18 08:58:24
约束条件是,对于每个收据,不能超过一个以上的任何一个。
我的错因为快速阅读。
更新:一对多
这里有一个ONE-TO-MANY relationship,所以一个简单的收据可以来自0 (或者1?)表之间的强制性是否与receipt相关?)与N相关的users,payment,organization等。
注意:如果您只能为每个用户提供一张收据:1到1,您将需要一个http://www.databaseprimer.com/pages/relationship_1to1/。
如何解决?
您必须改变您的愿景,在receipt表中有外键,其他表中必须有外键。
user
|-- id
|-- email
|-- other attributes
|-- receipt_id // foreign key refering to a single receipt.那么您的用户表将有额外的字段,
user_id email ..... receipt_id
1 a@a.com others 1
2 b@b.com others 1
3 c@c.com others 2您可以执行以下选择:
SELECT * FROM USERS WHERE receipt_id = 1产出:
1 a@a.com others 1
2 b@b.com others 1联接查询(选择接收并获取所有用户关联):
SELECT * from receipt r JOIN user u where r.id = u.receipt_id; 多对多
这意味着您需要一个连接表来映射多对多关系。
让我们向用户解释:
一个菜谱可以引用多个用户(实际上,不同的用户可以访问此菜谱,也可以使用不同的用户编写此菜谱)。
您将需要一个只有两个字段的表recipe_users --两个字段都是外键
recipe_users
|---- recipe_id // FK of recipe table
|---- user_id // FK of user table然后,您可以向不同的用户推荐一个菜谱。
recipe_id user_id
1 1
1 2
1 3或者为每个用户提供你想要的多少菜谱,
recipe_id user_id
1 1
2 1
3 1https://stackoverflow.com/questions/32067708
复制相似问题