2010-11-27 77 views
0

我对使用哪些数据类型以及如何从我的站点定义某些字段有几个问题。我目前的模式是在MySQL中,但正在转换到PostregSQL。字段数据类型/验证问题

  1. 首先&姓氏 - >因为我具备多郎,表中的所有支持UTF-8,但我需要将它们申报为套内用户进入一个中国名字为nvarchar?如果是这样,我如何强制字段验证,如果它被设置为只接受字母,因为我认为这些是英文字母,而不是验证有效的中文或阿拉伯文字母?而且我不认为PostregSQL支持nvarchar呢?

  2. 存储当前时间线 - >示例我在公司A从2009年1月到现在工作。所以我假设这里有3个字段:timeline_to,timeline_from,time_line present & from month/year varchars and present is just a flag to set the date?

  3. 用户密码。我正在使用SHA 256 + salting。因此,我已2个字段声明如下:
    password_hash - VARCHAR(64)
    password_salt- VARCHAR(64)
    这是否工作,如果用户密码需要是8个到32个字符长之间?

  4. 出生时间 - >我需要记录应用程序的出生时间来计算一些占星值。这意味着小时,分钟和上午/下午。因此,最好存储这些是使用varchar的3个单独的单选列表,或者在后端使用时间数据类型,并允许用户在前端使用单个选择列表?

  5. 最后仅适用于出生月份和年份,如果我将它们存储在不同的行中,这些是int或varchar吗?它们都有用于报告的int主键,所以int更有意义?或者我应该将它们作为日期类型存储在1个字段中?

回答

0
  1. 我不知道,从来没有处理这一领域多。

  2. 您可能会考虑在此处允许NULL并将其用作Present的特殊含义。如果你的应用程序逻辑看到一个非空的开始日期和一个空的结束日期,你可以推断这一点。如果它们都是NULL,则不能推断出任何信息。

  3. 既然你哈希,你总是会得到一个256位十六进制字符串作为输出,不管输入是什么,所以是的,8-32个字符的密码都可以工作。

  4. 在后端使用DATETIME。你可以像MONTH()这样的东西在你的SQL语法中直接提取这些部分。当然,你必须格式化日期以便SQL接受它,但这并不难。

  5. 再次,所有可用SQL中的DATETIME函数提取。

+0

for 2,我不能。我仍然需要存储开始/结束日期/时间,因为人们会在08年1月和2月9日之间搜索在X公司工作的其他人,因此需要保持开始/结束日期,这很好。我遇到的问题是退出当前处于活动状态的用户,因为他们没有固定的结束日期,但它始终是最新的,因此无法在数据库中存储任何日期。 – Markus 2010-11-27 08:14:58

1
  1. NCHAR,NVARCHAR没有。

    • 永远不要做任何变化,你可以使固定;对每个访问进行打包/解压都是一项额外的负担。这意味着永远不会使用索引列的var,你将会有一个非常缓慢的索引。磁盘空间现在很便宜。

    • 您需要级别的Language列,该列会告诉您在各种解析和验证要求中使用哪种语言。

  2. 比方说,你有Person, Employer,并Employment表。你讨论的专栏在Employment

    • 您需要StartDate列和EndDate列,它们是DATETIME数据类型。

    • 您不需要“存在”作为单独的列。 “存在”始终是最新的Employment行的值,除非设置为不同的值。设置数据库可以处理的最高日期的默认值,例如。 9999-12-31;这可以通过明确的条目来覆盖。

  3. 不,您只需要一个CHAR(256)列。汉克解释了它。

  4. 对于日期或时间的任何组件,请使用DATETIME数据类型。这就是它的目的。数据库一致地处理它,并将其完美地编入索引。你使用db的各种函数()对它执行DATE算术。并且避免将它编码为INT等所有问题(不允许有无效的日期或时间)。

  5. BirthDateTime是一个DATETIME列。