2011-07-23 173 views
0

我新的数据库设计, 我只是在看下面的两种方法我的设计,只是想知道,如果它支付采取第二种方式。但我再次认为这只是制作一张冗余表格。对此有何建议?数据库设计

第一种方法:

客户表
-------------------------------- -
CUSTOMER_ID - 主键
----------------------------------
称号
FIRST_NAME
姓氏
cell_number
ADDRESS_LINE1
ADDRESS_LINE2
城市
ZIP_CODE
国家
------------------------------ -

第二种方法:

客户表
---------------------------------
customer_id - 主键
------ ---------------------------
标题
FIRST_NAME
姓氏
cell_number
------- --------------------------

客户地址表
--------------------------------
address_id - 主键
------ --------------------------
CUSTOMER_ID - 外键
ADDRESS_LINE1
ADDRESS_LINE2
城市
ZIP_CODE
国家
---------------------------------

* 编辑:每个用户被允许在数据库中只有1个地址。

+1

如果客户可以有多个地址(#2),您可能需要指出地址类型:家庭,工作,小学,首选等。 – JeffO

回答

0

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

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

如果每个客户只有一个地址,你应该使用有以下几个原因第一位的, :

  1. 它更简单,它总是最好让事情变得简单
  2. 外键的开销,当你创建使用INSERT,因为数据库引擎必须检查第一个表的主键的所有行,以查看是否存在客户ID。
  3. 您必须对某些查询使用JOIN。

第二设计的另一个优点是,它具有对地址字段PRIMARY KEY, 这意味着数据库引擎将索引此列导致SELECT查询去 更快,但是你也可以创建这个索引在第一个设计上。

因此,总体而言,仅当您为每位客户提供多个地址时才需要进行第二种设计。

+0

每个用户只允许1个地址。我如何在第一个设计中创建索引? –

+0

基本的SQL语法是'CREATE INDEX index_name ON table_name(column_name)',有很多选项,你应该查看手册以查看所有的选项,g for MySQL检查此页面:http://dev.mysql.com/doc/refman/5.0/en/create-index.html,很多运气:)(PS记住,索引具有制作SELECT语句的优势走得更快,但对数据库的更改会更慢) – fiftyeight

1

第二种方法是只对你有利,如果你允许一个用户在你的数据库有多个地址同时,这我假设不是这样的,所以你应该与第一种方法去。

1

你知道吗,有超过一个办公室的任何公司? 如果您打算让他们成为客户,请使用第二种方法。

1

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

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

+0

+1因为-1看起来不好。 :-) –

1

事情要问自己:

  • 做我想做的,如果客户移动到更新整个客户记录(以及可能改变客户ID)?
  • 如果你的客户移动了,你想跟踪他们以前的地址吗?
  • 您的客户是否有多个送货地址?

这应该有助于回答你的问题。

0

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

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

如果送货地址为NULL,则使用帐单地址。