簡體   English   中英

數據庫中列的多個值

[英]more than one value for a column in database

是否可以在數據庫列中存儲多個值。 如果是,我應該使用哪種類型? 並通過我的java代碼如何插入值。

例如,我希望有一個“語言”列,可以存儲單行的java,c ++,c#等值。

編輯 :我希望有一個名為student的表,其中包含有關列的學生的所有信息,以存儲他所知道的語言的名稱。

您應該創建一個包含您要使用的所有不同語言的表“language”,然后使用外鍵從另一個表的LanguageID列鏈接到此表。

編輯:如果您想要給定記錄的語言不止一種,那么您還需要創建一個鏈接表,將記錄鏈接到給定的LanguageID。 然后,您可以通過在鏈接表中創建新記錄,為給定記錄放入任意數量的不同語言。

在單個列中存儲多個值通常不是一個好主意,因為它違反了數據庫規范化的原則。

從您的描述中可以看出,您有多對多的關系。 通過在列中存儲多個值來實現它會強制您在需要更新列或按語言查詢時更加努力地工作。

從技術上講,可以考慮一種解決方法(例如,Telcontar建議),但我建議您閱讀一些關於不同正常形式的內容,並重新考慮數據庫設計。

如果您了解數據庫設計並希望擺脫這種通常的“好”方法,那么您可以使用例如字符串。

在字符串中保留ISO語言代碼,例如“en-en”(第一個國家,第二語言變體“)以及分隔符標記,顯然空間​​可能是一個好的,所以”en-en de-de“for英語和德語。

然后,您可以在此字符串列上使用“like”運算符進行復雜的多語言匹配。

如果您是專業人士並且知道自己在做什么,可以稱之為優化。 如果你是一個新手,那么你顯然不知道你做了什么以及關系數據庫系統中的“關系”是什么意思。

使用連接表(也稱為鏈表)來定義nm關系。

用戶表(偽SQL):

CREATE TABLE user {
    id INTEGER GENERATED PRIMARY KEY,
    name VARCHAR
}

語言表(偽SQL):

CREATE TABLE language {
    id INTEGER GENERATED PRIMARY KEY,
    name VARCHAR
}

連接用戶和語言表(偽SQL):

CREATE TABLE user_language {
    user_id INTEGER FOREIGN KEY REFERENCES user(id),
    language_id INTEGER FOREIGN KEY REFERENCES language(id)
}

這樣,您就可以按用戶ID(以及與特定語言綁定的所有用戶)獲取所有語言。 一些RDBMS支持將這些值檢索為SQL ARRAY類型,而您可以通過ResultSet#getArray()在單個查詢中獲取這些類型。 例如,在PostgreSQL中,您可以執行以下查詢:

SELECT u.id, u.name, ARRAY(
    SELECT l.name
    FROM language l
    JOIN user_language ul ON u.id = ul.user_id
    WHERE l.id = language_id) AS languages
FROM user u

您可以在JDBC中處理如下:

while (resultSet.next()) {
    Long id = resultSet.getLong("id");
    String name = resultSet.getString("name");
    Object[] languages = resultSet.getArray("languages").getArray();
    // Cast to String[] or convert to List<String> or so yourself.
}

你的意思是枚舉,只能使用某些值,或者你的意思是在給定行的列中存儲多個值?

列舉

-- Works in MySQL for sure
table whatever (
  language enum('JAVA','C++,'C#') NOT NULL DEFAULT 'JAVA'
};

多重價值觀

不要這樣做,而是使用多對多關系:

table whatever (
  id int
);
table language (
  id int,
  name varchar(256)
)
table whatever_language)(
  whatever_id int,
  language_id int
)
-- don't forget foreign key constraints

您需要創建一個Zack所提到的語言表,其中表示每種語言,然后有一個表將它們鏈接到諸如_-Langage(其中_被原始表名替換)

此鏈接表將具有增量索引作為其主鍵,並將具有語言表的外鍵和原始表。 然后,在原始表中所需的每種語言的鏈接表中可以有多行

我認為Zack的答案是正確的,但是如果你真的需要在數據庫行中存儲多個值,你可以使用VARCHAR類型並使用像“;”這樣的分隔符。 分隔值,但在添加/編輯這些值以正確解析它們時必須小心。

或者,如果您使用的是Oracle數據庫,則可以將列的類型定義為ARRAY,但這是一個產生過多依賴關系的專有解決方案,我不建議使用它。

你所談論的是你的桌子(你沒有給出名字)和語言之間的多對多關系。
讓我假設您的表是關於人的,並且您想要跟蹤哪些人精通哪種語言。
任何給定的人都將精通一種(可能為零)或更多語言。 要對此進行建模,您需要三個表:Person,Language和第三個表,它們可能是LanguageProficiency,它引用了一個人和一種語言。 在此表中,您可以為同一個人或相同的語言創建多個行,但每個人和語言的唯一組合應該只有一個條目(即這兩列構成此表的主鍵)。

在這里使用第三個表的優勢(通過一些其他建議,例如將它們連接到文本字段中)是很容易將其擴展為包含其他屬性,例如一個人使用該語言多少年,或者對某種語言的掌握程度或某些考試成績的評分。 這些是您想要了解的每個人和語言組合的內容,因此它屬於LanguageProficiency表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM