2010-11-27 78 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列。