2016-08-02 17 views
-4

私の状況に基づいて、以下の方法1またはより多くの行を作成する方法2として、すべての現象を1つの行に結合する必要があります。私が方法1を好きではない理由は、それぞれの症状を分けるために使用しなければならないことです。後でphp explode( ' - ')を使用してそれらを区切り、LIKEを使用して一致させる必要があります。私のmysqlテーブルを作成するより良い方法は何ですか?

方法2はもっと多くの行を作成し、それらを分けるためにさらにテーブルを作成すると思います。

方法1:

disease   symptoms 
HIV    pain-cough-hair loss 
Flu    cought-running nose-fever 
cacer    lose weight-fever-fatigue 

方法2:

disease  symptoms 
HIV   pain 
HIV   cough  
HIV   hair loss 
...   ... 
...   ... 
+6

方法2.これは、単一のフィールドのdoesnに複数の値を格納することは非常にまれです惨めさと後悔で終わります。 – JNevill

+0

私はこの問題を解決するためにDISTINCTを使うことができますか? – conan

+2

どの問題を解決するのが独特か?問題は適切な正規化であり、別途、将来の規模です。今から1年後に症状の属性を保存し始めたいのであれば、方法1と一緒に行くと想像してください。あなたは地獄からの参加で終わるでしょう。 – JNevill

答えて

3

を参照してください含まれ、方法2が好ましいであろう。 @ JNevillメモ:1つの列に複数のデータを格納することは、データを検索またはフィルタリングするときに悪夢となります。

私は完全に推奨されるのはオプション3です。

表1:疾患

+------+-----------+ 
| id | name  | 
+------+-----------+ 
| 1 | HIV  | 
|------|-----------| 
| 2 | FLU  | 
|------|-----------| 
| 3 | Cancer | 
+------+-----------+ 

主キー:

  • id

表2:以下のデザインを見てみましょう現象

+------+-----------+ 
| id | name  | 
+------+-----------+ 
| 1 | pain  | 
|------|-----------| 
| 2 | cough  | 
|------|-----------| 
| 3 | hair-loss | 
+------+-----------+ 

主キー:

  • id

表3:疾患-現象

+-------------+--------------+ 
| disease_id | symptom_id | 
+--------------+--------------+ 
|   1 |   1 | 
|--------------|--------------| 
|   1 |   2 | 
|--------------|--------------| 
|   1 |   3 | 
+--------------+--------------+ 

主キー:

    > DISEASES_SYMTPOMS.disease_id
  • SYMTPOMS.id - - >DISEASES_SYMTPOMS.symptom_id

あなたのベーステーブルDISEASESSYMPTOMSを確立

  • DISEASES.id:外部キーが
  • (disease_id, symptom_id)

。その後、最初の2つのテーブルのJOINを表す3 rdテーブルを確立します。このデータの正規化は、アプリケーションの構造に過ぎず、各疾患に複数の症状があり、各症状が複数の疾患に属する可能性があるため、データの重複を防ぎます。

サンプルクエリ(MySQLの):

SELECT 
d.id, 
d.name, 
s.name 
FROM DISEASES as d 
INNER JOIN DISEASES_SYMPTOMS AS ds ON d.id = ds.disease_id 
INNER JOIN SYMPTOMS AS s ON ds.symptom_id = s.id; 

サンプルクエリ結果:

+------+----------------+----------------+ 
| id | disease_name | symptom_name | 
+------+----------------+----------------+ 
| 1 | HIV   | pain   | 
|------|----------------|----------------| 
| 1 | HIV   | cough   | 
|------|----------------|----------------| 
| 1 | HIV   | hair-loss  | 
+------+----------------+----------------+ 
+1

お時間をいただきありがとうございます。 – conan

1

それはあなたのデータベースになりたいどのように正規化によって決まります。より正規化されたアプローチは、すべての症状を収容する症状テーブル、すべての疾患を収容する疾患テーブル、および恐らくは疾患_IDおよび症候_IDによる症状への疾患を関連付ける別のテーブルを作成することである。あまり正規化されていないアプローチは、テーブル内のフィールドとしていくつかの区切り記号で区切ってすべての現象を含めるか、配列をサポートするデータベースを使用している場合は配列に配置する方法1のようなものです。

0

disease & symptomsの2つのmaster tablesを作成します。そして、3番目のテーブルを作成します。 disease_symptomは、2つの外部キー列がdisease_id & symptom_idを言うと、あなたの二つの方法のうち対応するマスタテーブル

関連する問題