2010-07-20 91 views
0

我正在使用简单的数据库设计,我认为最好的数据库示例是电子商务,因为它确实有很多问题,并且它对cms很熟悉。优化的数据类型+简单的数据库设计

USERS TABLE 
UID    |int    | PK NN UN AI 
username   |varchar(45)  | UQ INDEX 
password   |varchar(100)  | 100 varchar for $6$rounds=5000$ crypt php sha512 
name    |varchar(100)  | 45 for first name 45 for last 10 for spaces 
gender   |bit    | UN ,0 for women 1 for men, lol. 
phone   |varchar(30)  | see [2] 
email   |varchar(255)  | see RFC 5322 [1] 
verified   |tinyint   | UN INDEX 
timezone   |tinyint   | -128 to 127 just engough for +7 -7 or -11 +11 UTC 
timeregister  |int    | 31052010112030 for 31-05-2010 11:20:30 
timeactive  |int    | 01062010110020 for 1-06-2010 11:00:20 

COMPANY TABLE 
CID    |int    | PK NN UN AI 
name    |varchar(45)  | 
address   |varchar(100)  | not quite sure about 100. 
email   |varchar(255)  | see users.email, this is for the offcial email 
phone   |varchar(30)  | see users.phone 
link    |varchar(255)  | for www.website.com/companylink 255 is good. 
imagelogo  |varchar(255)  | for the retrieving image logo & storing 
imagelogosmall |varchar(255)  | not quite good nameing huh? let see the comments 
yahoo   |varchar(100)  | dont know 
linkin   |varchar(100)  | dont know 
twitter   |varchar(100)  | twitter have 100 max username? is that true? 
description  |TEXT    | or varchar[30000] for company descriptions 
shoutout   |varchar(140)  | status that companies can have. 
verified   |tinyint   | UN INDEX 

PRODUCT TABLE 
PID    |int    | PK NN UN AI 
CID    |int    | from who?santa? FK: company.cid cascade delete 
name    |varchar(100)  | longest productname maybe hahaha. 
description  |TEXT    | still confused useing varchar[30000] 
imagelarge  |varchar(255)  | for the retrieving product image & storing 
imagesmall  |varchar(255)  | for the retrieving small product image & storing 
tag    |varchar(45)  | for tagging like stackoverflow (index) 
price   |decimal(11,2)  | thats in Zimbabwe dollar. 
  1. 看到Using a regular expression to validate an email address
  2. 看到What's the longest possible worldwide phone number I should consider in SQL varchar(length) for phone

为什么InnoDB的具体点吗? 请参阅报价How to choose optimized datatypes for columns [innodb specific]?

其获得的话题,所以我必须创建另一个问题,人们不知道什么即时通讯试图说,或者我不能解释我想在那里。这次它的数据库设计。

请再次请 复制上面的示例,并将您的更改+注释与示例 一样。给它一个建议。

记住INNODB mysql。阅读上面链接的报价。谢谢。

+1

你究竟在问什么?你可以说得更详细点吗?你想要解决什么确切的问题?另外,标题中不需要括号内的东西,比如“[innodb]”,这就是标签的用途。 – Charles 2010-07-20 17:44:54

+0

是我的数据库设计吗?我只是想知道人们如何使用这种数据库方案。以及关于innodb的东西,谢谢,它看起来是一个矫枉过正,好在innodb一些像CHAR是更快然后varchar,即时通讯不擅长的事情,所以这里我问。 – 2010-07-20 18:04:42

回答

2

我打算回答这个问题,就好像您要求提供有关列定义的建议一样。我不会复制和粘贴你的表格,因为这完全是愚蠢的。

  • 不要将整个日期和时间存储为整数。改用DATETIME列。
  • 请记住,MySQL将DATETIMEs存储为GMT,但会在配置为使用的任何时区显示它们。格林威治标准时间可能值得setting the connection time zone,以便您的单独时区存储将起作用。
  • 请注意,并非所有时区都是格林威治标准时间的完整小时偏移量。夏令时也可以在小时计算中使用扳手。您可能想要存储时区字符串(即“America/Los_Angeles”)并在运行时找出正确的偏移量。
  • 您不需要为整数列指定字符数。
  • 不要害怕TEXT列。对于容易超过255个字符的数据(比如URL),您有很多VARCHAR(255)。

请记住,优化特定数据库引擎或优化磁盘存储是您应该做的最后一件事。使您的列定义符合数据。不成熟的优化是这个世界所有邪恶的根源之一。不要担心tinyint vs smallint vs int vs bigint,或者char vs varchar vs text vs bigtext。只要数据合适,95%的时间对你来说无关紧要。

+0

不成熟的优化。我喜欢那个。 btw即时通讯使用PHP使用时间(),是否更好地使用PHP来做第二份工作?或者让mysql做到这一点? – 2010-07-20 18:09:25

+0

如果你使用PHP,你应该使用[DateTime](http://us2.php.net/manual/en/book.datetime.php)。它包括[综合时区支持](http://us2.php.net/manual/en/class.datetimezone.php)。 – Charles 2010-07-20 20:10:45

1
USERS TABLE 
UID    |int(11)   | PK as primery key ? NN as not null ? UN AI 
username   |varchar(45)  | UQ 
password   |varchar(200)  | 200 is better. 
name    |varchar(100)  | ok 
gender   |blob    | f and M 
phone   |varchar(30)  | 
email   |varchar(300)  | thats 256 , put 300 insted 
verified   |tinyint(1)  | UN 
timezone(delate) |datetime   | this should be a php job 
timeregister  |datetime   | 
timeactive  |datetime   | 

COMPANY TABLE 
CID    |int(11)   | PK NN UN AI 
name    |varchar(45)  | 
address   |varchar(100)  | 100 is fine 
email   |varchar(255)  | 
phone   |varchar(30)  | 
link    |varchar(255)  | 
imagelogo  |varchar(255)  | 
imagelogosmall |varchar(255)  | the nameing is just fine for me 
yahoo   |varchar(100)  | see 3. 
linkin   |varchar(100)  | linkin use real names, maybe 100 is great 
twitter   |varchar(20)  | its 20 (maybe 15) 
description  |TEXT    | 
shoutout   |varchar(140)  | seems ok. 
verified   |tinyint(1)  | UN 

PRODUCT TABLE 
PID    |int(11)   | PK NN UN AI 
CID    |int(11)   | FK: company.cid cascade delete & update 
name    |varchar(100)  | 
description  |TEXT    | 
imagelarge  |varchar(255)  | 
imagesmall  |varchar(255)  | 
tag    |varchar(45)  | 
price   |decimal(11,2)  | 

在PHP看到php.net/manual/en/function.date-default-timezone-set.php

$time = date_default_timezone_set('Region/Town'); 
$time = date('Y-m-d H:i:s'); 
echo $time; 
  • http://www.eph.co.uk/resources/email-address-length-faq/
  • +0

    谢谢,我也是用我的用户名长度检查了我的Twitter帐户。 – 2010-07-20 18:01:35

    1

    您应该将所有日期/时间以GMT格式保存。最好的做法是将它们转换为0偏移量,然后将它们转换回用户当前显示的任何本地时区偏移量。

    Internet Explorer中最大URL长度(最小公分母)为2000个字符(仅使用TEXT)。

    您不设置INT类型的长度(将它们取下!)。 INT是32位(-2147483648到2147483647),BIGINT是64位,TINYINT是8位。

    对于bool /标志就可以使用BIT为1或0(你的“验证”为例),如果它是包括图像文件

    VARCHAR(255)可能太小了“imagelarge”和“imagesmall”名称和路径(请参阅上面的最大URL长度)。

    如果您对VARCHAR太大以及何时开始使用TEXT感到困惑,请使用TEXT

    +0

    哦,好的,只要看下面的例子。无论如何谢谢JhonB。顺便说一句BIT是个好主意!再次感谢。感谢法案 – 2010-07-20 18:20:49

    1

    对于它的价值,整数参数(例如INT(11))是没有意义的以任何方式存储或优化。该参数不表示最大长度或最大值范围,它只是一个提示。这使很多MySQL用户感到困惑,可能是因为它们用于指示最大长度的CHAR(11)。整数并非如此。 TINYINT(1)TINYINT(11)TINYINT(255)的存储方式与8位整数相同,并且它们具有相同的值范围。

    电子邮件地址的最大长度为320个字符。本地部分为64,@为1,域为255。

    我不喜欢使用VARCHAR(255)作为默认的字符串声明。为什么255是正确的长度? 254是不够长,256似乎太多了?答案是人们相信每个字符串的长度都存储在某个地方,通过将长度限制为255,他们可以确保长度只需要1个字节。他们通过允许尽可能长的字符串进行“优化”,同时仍将长度保持为1个字节。

    实际上,该字段的长度是而不是存储在InnoDB中。存储该行中每个字段的偏移量(参见MySQL Internals InnoDB)。如果您的总行长度为255或更少,则偏移使用1个字节。如果您的总行长度可能超过255,则偏移使用2个字节。由于您的行中有多个长字段,因此无论如何都要将偏移量存储在两个字节中。无处不在的值255可以针对一些其他RDBMS实现而优化,但不是InnoDB。

    此外,在某些情况下,MySQL会将行转换为固定长度格式,并根据需要填充可变长度字段。例如,在将行复制到排序缓冲区或存储在MEMORY表中或准备结果集的缓冲区时,必须根据列的最大长度而不是每个可用数据的长度来分配内存 - 基础。所以如果你声明VARCHAR列比实际使用的时间长得多,那么在这种情况下你就浪费了内存。

    这指出了试图针对特定存储格式优化得过细的危险。

    +0

    。亚当斋月 – 2010-07-20 19:07:57