2011-11-22 136 views
0

例如,假設我有一張帶有員工名單的表格。 員工ID是主鍵,我有員工的其他詳細信息,如姓名,年齡等。 員工可以有多個電話號碼。所以,它變成了一個多值屬性。 我們不知道員工有多少電話(聯繫電話)。是否有可能創建一個具有多個值的列的sqlite表?

是否有可能在sqlite3中有多值屬性? 還是有任何方法來適應這?

謝謝。

回答

2

您可以通過以下思路實現這一點:

  1. 創建1列來存儲所有的電話號碼(這使得基於數字查詢難,不推薦)
  2. 你可以爲每個數x列( phone1,phone2,...)(您需要決定每個用戶的最大電話號碼數)
  3. 您可以爲電話號碼創建單獨的表,並將該表與foreign key的員工錶鏈接。這允許您爲每個員工存儲各種不同的電話號碼列表(需要新表格)。

選項3似乎是最靈活的,但在大多數情況下,我已經看到有選項2實現(通常人們有限數量的電話號碼)。

+1

選項3是唯一合理的解決方案。其他兩個都違反了數據庫的標準化原則,並會導致編程更加困難。 –

+0

你應該在這裏真正嘗試遵循拉里的建議。如果您無法更改數據庫模式或說服其他人,那麼歡迎您使用編碼解決方案來解決您的問題。但是,認真聽取拉里的意見。 – Dubs

+0

感謝您的評論。是的,就模式規範化而言,選項3是最好的。但是,在電話號碼的情況下,人們通常只有1或2個號碼,而許多系統只能處理這些電話號碼。它還簡化了查詢並避免了在某些系統中很重要的連接。 – dzida

0

您還可以創建一個可序列化的自定義類來存儲多個聯繫號碼。然後,您可以將自定義類序列化爲一個byte [],然後從byte []中提取一個ASCII字符串。您可以存儲多個聯繫人號碼的這個字符串,但你將不得不從數據庫中讀取回來後反序列化數據(以下倒車的過程。)

public class Contacts : ISerializable 
{ 
} 

if (Contacts is ISerializable) 
{ 
    string contactNumbers = String.Empty; 

    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 
     formatter.Serialize(stream, Contacts); 
     stream.Close(); 
     var bytes = stream.GetBuffer(); 
     contactNumbers = System.Text.Encoding.ASCII.GetString(bytes)); 
    } 

    //Perform the update for this column or add to your insert query. 
} 
0

這是錯誤的做法關係數據庫術語。相反,您應該創建一個單獨的表來保存員工電話號碼。該表將具有列employee_id和phone_number。每個員工可能在此表中有0個或更多記錄,具體取決於您存檔的電話號碼數量。

您可能還需要包含說明欄,以便您可以獲得有關每個電話號碼的信息。

將多個值存儲在單個列中是關係數據庫中的一階否定。請不要這樣做。

0

多值字段在數據庫設計中被認爲是非常糟糕的做法,因爲它顯示缺少「正常形式」。相反,您應該:

  1. 用3列創建一個新的EmployeePhoneNumber表。 EmployeePhoneNumberId,EmployeeId,PhoneNumber和PhoneType。
  2. 添加一個約束,將Type列限制爲(Mobile,Home ..)之一。

現在,您可以將任意數量的電話號碼按類型添加到新表格中。根據需要通過employeeId查詢並輸入。

此選項不僅更加靈活,而且它將節省數據庫存儲大小,因爲您只會爲實際存在的電話號碼分配存儲空間。

相關問題