2010-09-01 151 views
1

我正在爲一個基本的CMS設計一個MySQL和PHP數據庫。 CMS將有一個前端,可以進行分類和搜索。後端將允許授權用戶上傳文件。MySQL數據類型?

我使用PHPMyAdmin,我想幫助建立我的數據庫。

我很樂意解釋各種MySQL數據類型以及它們的優點。請使用通用數據庫字段作爲示例。

下面是我想要的清單。缺少什麼以及需要使用哪些數據類型?

資源(對於我的文件)

  • 的file_id
  • 文件名(文件進行了預先排序和顯示名稱和路徑都是從這裏派生 。)
  • FILE_TYPE(PDF |音頻| VIDEO | PHOTO [也可用於生成文件 的網址])
  • 上傳日期(PHP或MySQL中的時間戳)
  • uploaded_by(從用戶表用戶ID)
  • 事件(從事件表事項標識,可選)

用戶(用戶帳戶 - 獲取管理員權限,也許通知列表)

  • user_id
  • first_name
  • last_name
  • emai升
  • 密碼
  • PHONE_NUMBER(可選)
  • permissions_level(只讀,上傳)
  • CREATION_DATE

活動

  • 事項標識
  • EVENT_NAME
  • event_location
  • EVENT_DATE
  • EVENT_DESCRIPTION
  • ENTRY_DATE
+1

那麼,一般的規則是:儘可能大,但儘可能小。因爲如果需要出現,以後再做更大更容易。 – 2010-09-01 21:46:03

回答

2

我會採取什麼:

資源(我的文件)

  • 的file_id INT(或SMALLINT取決於預期的條目數)
  • 名VARCHAR如果不再(或文本比255個字符)
  • file_type ENUM(如果只有你提到的那些或VARCHAR如果動態類型可以添加)
  • upl OAD DATE DATETIME(或日期如果你並不需要的時間)
  • uploaded_by INT(或SMALLINT但如同在user表)
  • 事件INT(或SMALLINT但相同的事件表)

用戶(用戶帳戶 - 獲取管理員權限,也許通知列表)

  • USER_ID INT(或SMALLINT取決於預期的條目數)
  • first_na我VARCHAR
  • 姓氏VARCHAR
  • 電子郵件VARCHAR
  • 密碼CHAR(40),(對於SHA1哈希)
  • PHONE_NUMBER VARCHAR(因爲它可能包含這樣的內容 - , - /或+)
  • permissions_level TINYINT(如果只是數值和最多127的值)
  • CREATION_DATE DATETIME(或日期如果你並不需要的時間)

活動

  • 事項標識INT(或SMALLINT取決於預期的條目數)
  • EVENT_NAME VARCHAR
  • event_location VARCHAR
  • EVENT_DATE DATETIME(或日期如果你並不需要的時間)
  • event_description TEXT(可能爲255的VARCHAR)
  • entry_DATE DATETIME(或DATE,如果您不需要時間)

當你設置好你的數據庫,並輸入一些虛擬的數據,你可以運行通過phpmyadmin一個簡單的語句,會告訴你,你的MySQL將採取針對該完全虛擬數據:

SELECT * FROM events PROCEDURE ANALYSE() 

在列Optimal_fieldtype你會發現MySQL告訴你要做什麼。但是你不應該採用確切的字段類型。它會經常告訴你需要一個ENUM,但大多數時候你添加了隨機數據,所以你必須採用VARCHAR,在這種情況下,列Max_length會給你提示它應該是多長時間。但是在所有的VARCHAR字段中,您應該添加額外的空間,具體取決於您期望值的長度。考慮到即使名稱可以超過50個字符。

+0

我用什麼鍵?主鍵或索引鍵?自動增量? – Moshe 2010-09-01 21:56:50

+0

您應該始終在每個表PRIMARY中創建'id',並且還應該使其成爲auto_increment。您還應該在其他表中的外鍵上添加索引(如「資源」表中的事件)。我通常在表中使用單個列名,例如只有'name'而不是'event_name',並且使用前綴名如'event_id'來知道它是另一個表中列的外鍵。但這取決於你。 – 2ndkauboy 2010-09-01 22:00:45

+0

您可以將每個表的單數附加到每列。因此,請使用'file_uploaded_by'而不是'uploaded_by'。如果你在該表中有類似'event_id'的東西,那麼它也很清楚,它是一個外鍵。您還應該將索引和全文索引添加到任何列中,您需要定期搜索或使用GROUP BY或ORDER BY,這將提高SELECTS的速度。 – 2ndkauboy 2010-09-01 22:03:18

0

缺什麼,還有就是那種你來決定/需要什麼。您應該閱讀設計數據庫。

至於數據類型對你有什麼

  • ID字段應該是一個INT,或BIGINT(取決於您的應用程序可能有多大成爲),並設置爲PRIMARY KEY

  • 名稱應該是varchar要多長時間取決於您的要求。大多數第一個/列表名稱通常最多爲25-30個字符。事件名稱可能會高達250,具體取決於您的要求。

  • 根據您的要求,該位置將類似於名稱爲VARCHAR,大約在50-150之間。

  • 日期應該是DATETIME字段。

  • 描述應該是VARCHAR(250)TEXT字段。

  • 權限真的取決於你想如何處理它。這可能是INTVARCHAR(如果您想序列化一個數組)。

  • 電話號碼可能是一個INT(如果你想去除所有非數字字符和格式化您自己的方式)或VARCHAR(15),如果你不想要去除人物

  • 電子郵件必須是由一個VARCHAR(250)

希望這會有所幫助,再次真的取決於爲應用程序和你設想什麼要求。但最初的類型總是可以隨着您的需求變化而改變。

編輯

如果你想了解不同的MySQL數據類型的完整信息,請閱讀手冊:http://dev.mysql.com/doc/refman/5.0/en/data-types.html

+0

如果他詢問數據類型,我猜他的ID不需要是BIGINT。只要說'... – 2010-09-01 21:52:51

+0

@JustinK - 等到我讀完手冊:P – Moshe 2010-09-01 21:55:44

+0

基於整數的主鍵,即tinyint,smallint,mediumint,int,bigint也應該是UNSIGNED,除非你想要-ve值 – 2010-09-01 22:20:31

1

您的用戶表不必須輸入密碼哈希列。不知道你是否打算讓它有這樣或沒有。我不知道我們該如何回答應該使用哪些數據類型,因爲它完全取決於您計劃如何使用列。對於日期,我比日期更喜歡日期時間,但這只是個人喜好,因爲我喜歡在查詢中手動插入日期。

+0

好點。我完全忘記了密碼哈希字段。 – Moshe 2010-09-01 21:46:42

+0

如果您不確定使用散列密碼的字段類型,請查看以下問題:http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed -password-field-and-what-length – 2ndkauboy 2010-09-01 22:08:01

+0

你甚至可以將一個HASH存儲在一個int(20)中,將其轉換爲十進制數,但是我建議避免這種額外的工作,因爲你只能節省空間的字節但在實施時遇到一些麻煩。 – 2ndkauboy 2010-09-01 22:13:26