Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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
Php MySQL数据库中的循环引用_Php_Mysql - Fatal编程技术网

Php MySQL数据库中的循环引用

Php MySQL数据库中的循环引用,php,mysql,Php,Mysql,我正在处理一个数据库,其中有一个客户表、一个供应商表和一个地址表。我想我应该在地址表的每一行中放置一个客户id和供应商id,但允许它们为空 供应商一次可能有一个地址,但为了以防万一,我将创建它以允许多个地址 客户通常有2个地址,但可能有多个 customer表将包含字段“default\u shipping\u id”和“default\u billing\u id” 我可以在没有外键约束的情况下执行此操作,但如果我尝试使用约束创建这些表,则会由于循环引用而出错。我应该将约束设置为单向还是可以/

我正在处理一个数据库,其中有一个客户表、一个供应商表和一个地址表。我想我应该在地址表的每一行中放置一个客户id和供应商id,但允许它们为空

供应商一次可能有一个地址,但为了以防万一,我将创建它以允许多个地址

客户通常有2个地址,但可能有多个

customer表将包含字段“default\u shipping\u id”和“default\u billing\u id”


我可以在没有外键约束的情况下执行此操作,但如果我尝试使用约束创建这些表,则会由于循环引用而出错。我应该将约束设置为单向还是可以/应该在创建完所有表后添加约束?

在设计数据库时尽量保持整洁和灵活。5张表格,提供您的解决方案-

1) `address` table
`id`
`address`

2) `customers` table
`id`
`name`
`email`

3) `customer_address_mapping` table
`id`
`customer_id` (FK to `customers` table)
`address_id` (FK to `address` table)
`is_billing` (Boolean field)
`is_shipping` (Boolean field)

4) `vendors` table
`id`
`name`
`email`

5) `vendor_address_mapping` table
`id`
`vendor_id` (FK to `vendors` table)
`address_id` (FK to `address` table)

说明:


地址
表将是所有
客户
供应商
的所有
地址
转储。这两个映射表都将为您提供添加任意多个地址的灵活性
is\u billing
is\u shipping
布尔字段将让您知道客户的地址类型。

在地址表上设置
default\u shipping
default\u billing
布尔值?您还可以考虑将<代码>客户<代码>和<代码>供应商< /Cord>表合并为一个代码>用户< /C> >表,并且有一个类型字段是
customer
vendor
,这样您就不必将两个表连接到地址这里没有循环引用,除非您使外键关系双向进行。如果您确实需要这样做,那么您可能应该切换到Postgres,因为MySQL事务不能正常工作,因为它们不会延迟外键检查以适应这样的插入。@cmorrissey使用BOOL标记“默认”地址可能会导致不一致,因为它允许多个地址作为默认地址。坏主意。我想我最好还是问“所有外部表引用都应该使用外键约束吗?”我也会问简单的
n:m
关系。但我并没有对这个答案投赞成票,因为它实际上并没有回答这个问题;-)OP要求解释外键关系,但这个答案根本没有提到。此外,我会选择一个类似
address\u type ENUM('shipping','billing')
的字段,而不是您建议的两个
BOOL
。两个
BOOL
s都可以是
false
,允许可能不可用/未使用的地址。客户可能会将其项目和账单发送到同一地址,因此除非我在映射表中允许第二个条目,否则枚举在该实例中不起作用。我的表实际上比我描述的更复杂,但概念应该是相同的。引用什么是FK,但不实现约束是否有任何错误?