Database design 数据库设计

Database design 数据库设计,database-design,Database Design,我是数据库设计新手, 我正在研究以下两种设计方法,并想知道采用第二种方法是否值得。但我又一次认为那只是在做一张多余的桌子。有什么建议吗 第一种方法: 客户表 ----------------- 客户id-主键 ----------------- 标题 名字 姓 单元号 地址(第1行) 地址(第2行) 城市 邮政编码 国 ---------------- 第二种方法: 客户表 ----------------- 客户id-主键 ----------------- 标题 名字 姓 单元号 -----

我是数据库设计新手, 我正在研究以下两种设计方法,并想知道采用第二种方法是否值得。但我又一次认为那只是在做一张多余的桌子。有什么建议吗

第一种方法:

客户表 ----------------- 客户id-主键 ----------------- 标题 名字 姓 单元号 地址(第1行) 地址(第2行) 城市 邮政编码 国 ----------------

第二种方法:

客户表 ----------------- 客户id-主键 ----------------- 标题 名字 姓 单元号 -----------------

客户地址表 ---------------- 地址\u id-主键 ---------------- 客户id-外键 地址(第1行) 地址(第2行) 城市 邮政编码 国 -----------------


*编辑:每个用户在数据库中只能有一个地址。

第二种方法只有在允许一个用户同时在数据库中有多个地址时才对您有益,我假设不是这样,因此,您应该使用第一种方法。

第二种方法只有在允许一个用户同时在数据库中拥有多个地址时才对您有利,我假设不是这样,所以您应该使用第一种方法。

您应该检查

然后你所有的问题都将结束:

你应该检查一下


然后你所有的问题都会结束:

你知道有哪家公司有不止一个办公室吗?
如果您想让他们成为客户,请使用第二种方法。

您知道有哪家公司拥有多个办事处?
如果您想让他们成为客户,请使用第二种方法。

第一种方法会更快,因为您在查找地址信息时不需要执行联接查询


如果允许用户拥有多个地址,则第二种方法是合适的。

第一种方法速度更快,因为在查找地址信息时不需要执行联接查询


如果您允许用户拥有多个地址,则第二种方法是合适的。

要问自己的问题:

如果客户移动,我是否要更新整个客户记录并可能更改客户ID? 如果您的客户搬家,您是否希望跟踪他们以前的地址? 您的客户是否有多个送货地址?
这应该有助于回答您的问题。

问问自己:

如果客户移动,我是否要更新整个客户记录并可能更改客户ID? 如果您的客户搬家,您是否希望跟踪他们以前的地址? 您的客户是否有多个送货地址?
这应该有助于回答您的问题。

主要问题是客户是否可以有多个地址

如果客户有多个地址,则第二种设计将是合适的

如果每个客户只有一个地址,则应使用第一个地址, 有几个原因:

它更简单,而且总是最好保持简单 使用INSERT时,外键会产生开销,因为DB引擎必须检查第一个表的主键的所有行,以查看客户ID是否存在。 对于某些查询,您必须使用JOIN。 第二种设计的另一个优点是在地址字段上有一个主键, 这意味着DB引擎将对此列进行索引,从而导致SELECT查询 更快,但是您也可以在第一次设计时创建此索引


因此,总体而言,只有当每个客户都有多个地址时,才需要第二种设计。

主要问题是客户是否可以有多个地址

如果客户有多个地址,则第二种设计将是合适的

如果每个客户只有一个地址,则应使用第一个地址, 有几个原因:

它更简单,而且总是最好保持简单 使用INSERT时,外键会产生开销,因为DB引擎必须检查第一个表的主键的所有行,以查看客户ID是否存在。 对于某些查询,您必须使用JOIN。 第二种设计的另一个优点是在地址字段上有一个主键, 这意味着DB引擎将对此列进行索引,从而导致SELECT查询 更快,但是您也可以在第一次设计时创建此索引


因此,总的来说,只有当每个客户有多个地址时,才需要第二种设计。

客户也可能有单独的账单和发货地址。我用过:

...
billing.address_line1
billing.address_line2
...
shipping.address_line1
shipping.address_line2
...

如果配送地址为空,则使用账单地址。

客户也可能有单独的账单地址和配送地址。我用过:

...
billing.address_line1
billing.address_line2
...
shipping.address_line1
shipping.address_line2
...

如果配送地址为空,则使用账单地址。

如果客户可以有多个地址2,则您可能需要指出地址类型:家庭、工作、主要、首选等。如果客户可以有多个
地址2您可能希望指明地址类型:家庭、工作、主要、首选等。每个用户只允许有一个地址。如何在第一个设计中创建索引?基本的SQL语法是在table\u name column\u name上创建索引index\u name,还有很多选项,您应该查看手册中的所有选项,例如对于MySQL,请检查此页面:,幸运的是:请记住,索引具有使SELECT语句运行更快的优势,但对DB的更改将较慢每个用户只允许一个地址。如何在第一个设计中创建索引?基本的SQL语法是在table\u name column\u name上创建索引index\u name,还有很多选项,您应该查看手册中的所有选项,例如对于MySQL,请检查此页面:,幸运的是:p.s.记住索引的优点是使SELECT语句运行得更快,但对DB的更改会更慢