mysql - 设计客户数据表?

标签 mysql database-design

  • 对于一个基本的电子商务网站,我应该从客户那里收集的最重要的数据是什么?

    这些是我想到的一些按部分分隔的数据(这还不是表格设计,因为它可以完全或分开,但稍后会讨论):

    • 登录凭据:

      email, password
      
    • secret 问题数据:

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

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

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

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

  • 我应该使用哪种字段类型最能描述下面的每个字段?我已经定义了哪些我应该更改或考虑的内容?

  • 我应该使用一张以上的 table 吗?
    • 为什么?什么时候 ?除了组织之外还有什么收获吗?
    • 当我需要使用内连接或左连接检索它时,这在某种程度上不是很糟糕吗?

这是我现在考虑的单个表的设计示例:

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,我没有那种可用的数据来允许用户自己输入或选择系统中可用的数据。

最佳答案

安全问题
请注意, secret 问题会破坏您的整个安全系统。因为您正在以明文形式存储 secret 答案和 secret 问题。

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

如果您必须使用 secret 问题的错误概念(答案是在用户的 Facebook 页面上轻松谷歌)。
至少将答案存储为:

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

Should I also have a username and allow the user to pick which one he wants to use to login ? Does that bring any advantages ?

  • 作为用户,我更喜欢电子邮件地址。
  • 它很独特,我永远记不起我的用户名,但电子邮件地址很简单。
  • 电子邮件地址具有双重作用,即作为用户的通信链接。
  • 如果您必须拥有电子邮件地址,添加用户名只是额外的努力,没有任何好处。
  • 如果用户名必须是唯一的,则会给用户带来进一步的负担(没有人愿意被命名为 Snowwhite45875,因为 Snowwhite 1..45874 已被占用)

•Should I use more then one table ? •why ? when ? any gains other then organization ?

我认为没有必要,目前 1 个表就足够了,并且会简化您的数据库。
如果您想稍后将数据拆分为 2 个表,可以使用 View 来组合这些表。

•What about when I need to retrieve it with inner or left joins wouldn't that be bad in a way ?

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

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

关于mysql - 设计客户数据表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915290/

相关文章:

mysql - 数据库设计 : relate to car's model or trim?

postgresql - 触发器中的动态函数调用

mysql - mysql 中所有类型的数值应使用哪种数据类型

php - 确保 PHP/MySQL 代码一次性执行?

php - 使用 PHP MySQL 更新玩家分数

database - postgresql:md5 消息摘要的数据类型?

ruby-on-rails - 如何建立/维护 2 个用户之间的亲和性分数?

php - 表的左连接获得如此多的记录。 php pdo mysql

javascript - Ajax 调用 php 文件不起作用

sql - MySQL - 如何使用 "0"填写邮政编码?