Database-Design

引用表數據不變時外鍵的使用

  • November 2, 2014

我必須設計一個表格,其中使用者有 10 個欄位,6 個是下拉列表。有些是單選,有些是多選。下拉數據應該很少更改。

例如,向使用者呈現一周中的幾天並且可以選擇任意天數。這將是一個一對多的表UserDayPref(user_id, day)。現在我有3個選擇:

  1. 創建表 Days 並在tableUserDayPref的外鍵中創建 day 欄位Days
  2. 將日期欄位設為字元串並保存日期的名稱。
  3. 將當天的名稱映射到整數並保存整數。

我傾向於為此和所有其他下拉欄位實施第三個選項。我很確定數據很少會被編輯。

這是正確的方法嗎?還是使用外鍵是正確的方法?

即使您想使用第三個選項,您也可以擁有外鍵。

就像在您的範例中一樣,您正在討論一周中的哪幾天它們永遠不會改變。

在除一周中可能發生變化的日子以外的情況下,我認為您必須使用外鍵以保持數據庫完整性。

選項 1 是您的最佳選擇,只需確保 Days 表有一個簡單的類型 id 列,然後您將在 UserDayPref 表中引用該列。如果 UserDayPref 表變大,將 ID 欄位保持為一個簡單的值將節省空間並進行快速連接。

如果您選擇選項 3,您實際上是將部分數據移動到應用程式碼中,因為您將在程式碼中而不是在數據庫,它們真正屬於的地方。這就是關係數據庫的用途;-)

所以,基本上選擇這樣的東西(使用oracle語法)

   CREATE TABLE USERS
   (
    id int primary key, 
    name varchar2(10)
   )

/

CREATE TABLE days
   (
    id char(1) primary key, 
    name varchar2(10)
   )

/

CREATE TABLE option1
   (
    id char(1) primary key, 
    name varchar2(10)
   )

/

CREATE TABLE option2
   (
    id char(1) primary key, 
    name varchar2(10)
   )

/


CREATE TABLE UserDayPref(user_id INT references users(id), 
                        day_id char(1) references days (id), 
                        option1_id char(1) references option1 (id),
                        option2_id char(1) references option2 (id))

引用自:https://dba.stackexchange.com/questions/42776