2017-07-15 76 views
1

我是數據庫新手,特別是MySQL。假設我需要在MySQL中存儲平坦的鍵值數據結構。每個數據結構都有一些必填字段和一些事先未知的可選字段,並且可能會頻繁更改。如何在MySQL中存儲鍵值對?

我需要通過其中一個必填字段檢索所有數據結構,並可能將其刪除。

所以我想結構存儲這些數據,這樣的一個表: (只是從網上覆制粘貼,而不是工作的代碼)

CREATE TABLE my_data_structures (
    my_data_structure_id INT  NOT NULL, 
    my_required_field1 VARCHAR NOT NULL, 
    my_required_field2 INT  NOT NULL, 
    PRIMARY KEY (my_data_structure_id) 
) 

CREATE TABLE my_optional_fields (
    my_optional_field_name VARCHAR NOT NULL, 
    my_optional_field_value VARCHAR NOT NULL, 
    FOREIGN KEY (my_data_structure_id) REFERENCES my_data_structures(my_data_structure_id) 
) 

請問這種做法是否合理?如何爲第二個表定義primary key

+0

看看[EAV模型](https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model) –

+0

@PaulSpiegel謝謝。只是搜索了一下。許多人說'EAV'是EVIL。 – Michael

+0

如果沒有提供合適的替代品,很容易說出一些事情是邪惡的。但是 - 我不說你應該使用EAV - 我說,你正在嘗試做的**是** EAV模型。 –

回答

1

對於第二個表,我會建議:

  • 增加一個明確的自動遞增的主鍵。
  • 申報的varchar
  • 長度聲明my_data_structure_id
  • unique約束

的結果是這樣的:

CREATE TABLE my_optional_fields (
    my_optional_fields_id int auto_increment primary key, 
    my_data_structure_id int not null, 
    my_optional_field_name VARCHAR(255) NOT NULL, 
    my_optional_field_value VARCHAR(255) NOT NULL, 
    FOREIGN KEY (my_data_structure_id) REFERENCES my_data_structures(my_data_structure_id) 
    UNIQUE (my_data_structure_id, my_optional_field_name, my_optional_field_value) 
); 

我猜測,唯一約束是對對。但是,如果只需要給定名稱的一個字段,請排除unique約束中的值。

+1

如果'my_optional_field_name'是可選的,你可能不希望** NOT NULL **或者'my_optional_field_name' – RiggsFolly

+0

恕我直言,UNIQUE KEY應該是'(my_data_structure_id,my_optional_field_name)'。 –

+0

@PaulSpiegel。 。 。你是對的。 –

1

我經常提醒EAV的危害,但我不會說它是EVIL。這只是從根本上說不是關係型的,所以使用像SQL這樣的語言來設計用來存儲和查詢關係數據總是會變得笨拙和低效。

如果沒有其他選項,請使用EAV,但請注意,當您使用EAV時,您有義務爲自己做更多的工作。您的查詢將更加複雜,您將失去數據庫服務器執行約束的能力,等等​​。

另一種方法是使用某種類型的非關係數據庫,如文檔存儲,以便可以根據需要插入一組用戶定義的字段。

MySQL提供了JSON data type,因此您有一種混合模式,您可以將常規列與SQL數據類型用於您始終需要的屬性,然後將JSON用於動態屬性。