设计客户数据表?

时间:2011-10-27 11:36:07

标签: mysql database-design

  • 我应该从客户端收集的基本电子商务网站最重要的数据是什么?

    这些是由部分分开的一些数据(这不是一个表格设计,因为它可以完全或分开,但稍后会进入):

    • 登录凭据:

      email, password
      
    • 秘密问题数据:

      secret question, secret question answer (or other method)
      
    • 客户数据:

      name, last name, birthday, address, city, state,
      country, postal code, phone, cellphone
      

    从上面我可能会遗漏一些东西,但如果你能指出我可以为注册模式收集的任何其他有益数据,我将不胜感激。

    我是否还应该拥有用户名并允许用户选择要用于登录的用户名?这会带来什么好处吗?

  • 我应该使用哪种字段类型最好地描述下面的每个字段?我已定义的任何我应该改变或考虑的内容?

  • 我应该使用多个表吗?
    • 为什么?什么时候 ?组织以外的任何收益?
    • 当我需要使用内连接或左连接检索它时,在某种程度上这不是很糟糕吗?

这是我现在想作单表的设计示例:

id int(X) PRIMARY auto increment
email varchar(X) UNIQUE
password_hash varchar(64)
password_salt varchar(6)
language tinyint(1)
time_offset varchar(5)
secret_question_id tinyint(3)
secret_question_answer varchar(X)
name varchar(X)
last_name varchar(X)
birthday datetime
address varchar(X)
address_complement(X)
city_id int(X)
city varchar(X)
state_id int(X)
state varchar(X)
country_id int(X)
postal_code int(X)
phone_regional_ext int(X)
phone int(X)
cellphone_regional_ext int(X)
cellphone int(X)
ts_register datetime
ts_last_update timestamp NULL on update CURRENT_TIMESTAMP
status tinyint(1)

标有X的东西我仍然需要检查并查看可接受的大小或正确的字段类型。

至于state和state_id以及正在考虑国家的city和city_id我没有那种可用的数据,允许用户自己输入或选择系统中可用的数据。

3 个答案:

答案 0 :(得分:1)

一般

  1. 我会将用户个人资料的用户帐户详细信息泄露到2个表格中。

  2. 我会默认使用用户名,因为我认为登录更快更容易。

  3. 您可以考虑添加性别字段。地点,年龄和性别数据可以帮助您更好地推广您的产品或服务。

答案 1 :(得分:1)

安全问题
请注意,secret question会破坏整个安全系统。因为你正在以明确的方式存储秘密答案和秘密问题。

我建议使用它。将重置密码通过电子邮件发送到确认的电子邮件地

如果你必须使用秘密问题的错误概念(在用户的Facebook页面上答案是一个简单的谷歌)。
至少将答案存储为:

answer_hash = SHA2(CONCAT(salt, lowercase(answer)),512)
  

我是否还应该拥有用户名并允许用户选择要用于登录的用户名?这会带来什么好处吗?

  • 作为用户,我更喜欢电子邮件地址。
  • 这是唯一的,我永远不会记住我的用户名,但电子邮件地址很简单。
  • 电子邮件地址作为与用户的通信链接的双重职责。
  • 如果您必须拥有该电子邮件地址,则添加用户名只是额外的努力,没有任何好处。
  • 如果用户名必须是唯一的,则会给用户带来更多负担(因为snowwhite 1..45874已被拍摄,所以没有人想要命名为snowwhite45875)
  

•我应该使用多个表吗? •为什么?什么时候 ?组织以外的任何收益?

我认为不需要,1表现在可以正常运行,它会简化您的数据库 如果您想稍后将数据拆分为2个表,则可以使用视图来组合表。

  

•当我需要使用内部或左侧连接检索它时,在某种程度上这不是很糟糕吗?

使用左连接检索可选数据 使用内部联接检索链接1对1的数据。

如果您加入主键,则不会花费大量时间,但仍需要时间。

答案 2 :(得分:1)

老实说,我不确定StackOverflow是否是满足您需求的最佳位置,但我会根据自己的经验添加一些项目。

大多数电子商务系统将“送货地址”和“帐单地址”视为单独的数据属性。

大多数电子商务系统允许用户存储多个地址,并保留历史记录。

大多数电子商务系统都存储客户联系首选项 - 新闻信件,这些信息可以排序。

大多数电子商务系统都存储客户付款方式(但信用卡号等敏感数据要么被遗漏,要么加密)。

大多数电子商务系统都会存储多种付款方式,并附有历史记录。

某些电子商务系统存储个性化数据,例如产品偏好等。

对于大多数这些数据项,您可能需要将它们存储在单独的表中,然后加入它们。你问是否有“组织”以外的任何好处 - 对于某些概念,几乎不可能在不引入新表的情况下存储所需的数据。例如,如果要为给定用户存储多个传递地址,则地址数据应位于单独的表中。 这不是一个错误 - 这是一个功能。连接不是“坏” - 它们只消耗最少的资源(只要你加入索引字段)。