3

私は次の設定をしています:

たとえば、ピザの詳細を含むn列のテーブル。この時点で 4 種類のピザがあります。これまでは、すべてのピザの詳細が同じで、各詳細が列に保存されていました。

しかし、スーパーピザと呼ばれる新しい種類のピザが登場し、さらに 2 種類の詳細を保存する必要があります。

これを行うには2つの方法があります(私が考えることができます):

  1. 既存のテーブルに列を追加し、残りの 4 種類のピザについては空白/null/その他のままにします

  2. 3 つの列 (idPizza、newDetail1、newDetail2) を持つ新しいテーブルを作成し、ピザを残りのピザとして保存し、データを取得したら 2 つのテーブルを結合します。

最初のオプションには、新しいタイプ (平均的なピザの分布でテーブルの 80%) を除くすべてのピザの役に立たないデータを保持するという欠点があります。

2 番目のオプションには、新しい種類のピザを入手するたびに参加する必要があるという欠点があります。また、データベースは一種の「乱雑」になります...ピザ要素の一部がテーブルに格納され、他の部分が別のテーブルに格納されます。

最終的には好みの問題であることは承知していますが、どのように進めるべきだと思いますか? 私は最初のオプションに少し傾いていますが、セカンドオピニオンを歓迎します。

注: テーブルには多数のエントリがあります (数万のように)。

2番目のメモ(回答に基づく):「ピザ」テーブルをリファクタリングすることはできません。追加するだけです。

4

3 に答える 3

1

これの代わりに、次のようにフラットテーブルの概念を使用できます。これにより、将来、より詳細な新しいピザの特性を簡単に追加できます

 CREATE TABLE pizza 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     details varchar(30)
    );

INSERT INTO pizza
(name, details)
VALUES
('pizza1', 'nice pizaa'),
('pizza2', 'nice pizza@sqlfiddle');


CREATE TABLE details 
    (
     id int auto_increment primary key, 
     name varchar(20)

    );

INSERT INTO details
(name)
VALUES
('pizza_size'),
('price');

CREATE TABLE pizza_details 
    (
      id int auto_increment primary key, 
     pizza_id int(10) , 
     details_id int(10) , 
     details_value varchar(20)

    );

INSERT INTO pizza_details
(pizza_id,details_id,details_value)
VALUES
(1,1,'small'),
(1,2,'Rs 20'),
(1,1,'big'),
(1,2,'Rs 50');

そしてクエリを起動します

select pizza.name as pizza_name,details.name as detail,pizza_details.details_value  from pizza_details left join details ON pizza_details.details_id = details.id
left join pizza On pizza_details.pizza_id = pizza.id;

SQL フィドル

于 2013-05-10T07:15:17.563 に答える
0

属性(idPizza、newDetail)を含むテーブルを作成し、以下のようにデータを保存することをお勧めします

idPizza、newDetail1 1 1 詳細 2 2 詳細 3 超詳細 3 超詳細 2 番目

idPizza、newDetail1 をプライマリにする

于 2013-05-10T07:33:25.483 に答える
0

最初のオプションの使用を提案しました。2 番目のオプションは 1 番目のオプションよりも多くのリソースを予約するため、処理に時間がかかります。

あなたが言及した最初のオプションの欠点は非常に明白ですが、より多くの列が必要な場合は、その既存のテーブルに新しいものを追加してください。

于 2013-05-10T07:24:30.840 に答える