例如,假設我有一張帶有員工名單的表格。 員工ID是主鍵,我有員工的其他詳細信息,如姓名,年齡等。 員工可以有多個電話號碼。所以,它變成了一個多值屬性。 我們不知道員工有多少電話(聯繫電話)。是否有可能創建一個具有多個值的列的sqlite表?
是否有可能在sqlite3中有多值屬性? 還是有任何方法來適應這?
謝謝。
例如,假設我有一張帶有員工名單的表格。 員工ID是主鍵,我有員工的其他詳細信息,如姓名,年齡等。 員工可以有多個電話號碼。所以,它變成了一個多值屬性。 我們不知道員工有多少電話(聯繫電話)。是否有可能創建一個具有多個值的列的sqlite表?
是否有可能在sqlite3中有多值屬性? 還是有任何方法來適應這?
謝謝。
您可以通過以下思路實現這一點:
選項3似乎是最靈活的,但在大多數情況下,我已經看到有選項2實現(通常人們有限數量的電話號碼)。
您還可以創建一個可序列化的自定義類來存儲多個聯繫號碼。然後,您可以將自定義類序列化爲一個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.
}
這是錯誤的做法關係數據庫術語。相反,您應該創建一個單獨的表來保存員工電話號碼。該表將具有列employee_id和phone_number。每個員工可能在此表中有0個或更多記錄,具體取決於您存檔的電話號碼數量。
您可能還需要包含說明欄,以便您可以獲得有關每個電話號碼的信息。
將多個值存儲在單個列中是關係數據庫中的一階否定。請不要這樣做。
多值字段在數據庫設計中被認爲是非常糟糕的做法,因爲它顯示缺少「正常形式」。相反,您應該:
現在,您可以將任意數量的電話號碼按類型添加到新表格中。根據需要通過employeeId查詢並輸入。
此選項不僅更加靈活,而且它將節省數據庫存儲大小,因爲您只會爲實際存在的電話號碼分配存儲空間。
選項3是唯一合理的解決方案。其他兩個都違反了數據庫的標準化原則,並會導致編程更加困難。 –
你應該在這裏真正嘗試遵循拉里的建議。如果您無法更改數據庫模式或說服其他人,那麼歡迎您使用編碼解決方案來解決您的問題。但是,認真聽取拉里的意見。 – Dubs
感謝您的評論。是的,就模式規範化而言,選項3是最好的。但是,在電話號碼的情況下,人們通常只有1或2個號碼,而許多系統只能處理這些電話號碼。它還簡化了查詢並避免了在某些系統中很重要的連接。 – dzida