0

deal.tariff_id内の関税に属していることを表すためにで 'NULL' 値を使用してもよろしいですか?tariff_dataaffiliate_id=3

例えば:

mysql> select * from phone;
+----+------------------+
| id | name             |
+----+------------------+
|  4 | HTC Sensation XL |
| 26 | iPhone 4s        |
| 25 | iPhone 5         |
| 24 | Nokia C3-01      |
+----+------------------+

mysql> select * from tariff;
+----+-----------------+-----------------+--------------+-------------+
| id | name            | tariff_duration | monthly_cost | description |
+----+-----------------+-----------------+--------------+-------------+
|  1 | Business Plan 1 |              24 |         5.00 |             |
|  2 | Business Plan 2 |              24 |        10.00 |             |
|  4 | Business Plan 3 |              24 |        15.52 |             |
|  5 | Business Plan 4 |              24 |        18.52 |             |
|  8 | Super Plan      |              12 |        15.00 |             |
+----+-----------------+-----------------+--------------+-------------+

mysql> select * from tariff_data;
+----+-----------+--------------+-------+
| id | tariff_id | affiliate_id | bonus |
+----+-----------+--------------+-------+
|  1 |         1 |            3 | 34.00 |
|  2 |         2 |            3 | 44.00 |
|  5 |         3 |            3 | 10.00 |
|  6 |         4 |            3 | 10.00 |
|  7 |         5 |            3 | 10.00 |
+----+-----------+--------------+-------+

deal表には、表に記載されている関税が表示affiliate_id=3tariff_id=NULLれ、それに属していtariff_dataます。の行数を減らすためにこれを行いましたdeal。NULL を含めない場合はtariff_id、同じものを多数含める必要がphone_idあり、その逆も同様です。

mysql> select * from deal;
+----+----------+-----------+--------------+--------+
| id | phone_id | tariff_id | affiliate_id | active |
+----+----------+-----------+--------------+--------+
|  1 |        4 |      NULL |            3 |      1 |
|  3 |       24 |      NULL |            3 |      1 |
|  9 |       24 |         8 |            4 |      1 |
| 10 |       25 |         8 |            4 |      1 |
| 11 |       26 |         8 |            4 |      1 |
+----+----------+-----------+--------------+--------+

NULL 値を使用しなかった場合の例を更新します。

mysql> select * from deal;
+----+----------+-----------+--------------+--------+
| id | phone_id | tariff_id | affiliate_id | active |
+----+----------+-----------+--------------+--------+
|  1 |        4 |         1 |            3 |      1 |
|  2 |        4 |         2 |            3 |      1 |
|  3 |       24 |         1 |            3 |      1 |
|  4 |       24 |         2 |            3 |      1 |
|  5 |       24 |         3 |            3 |      1 |
|  6 |       24 |         4 |            3 |      1 |
|  7 |       24 |         5 |            3 |      1 |
|  9 |       24 |         8 |            4 |      1 |
| 10 |       25 |         8 |            4 |      1 |
| 11 |       26 |         8 |            4 |      1 |
+----+----------+-----------+--------------+--------+
4

5 に答える 5

2

目的の結果を得る方法はいくつかありますが、NULL よりも論理的な方法を使用してください。

Oded が指摘したように、NULL は欠落している未知の値を表すことを意図しています

  • 所有権を示す列がある場合があります
  • 正規化
  • NON NULL 値を持つ所有権の指標として、既存の列「tariff_id」を使用します
于 2012-10-06T20:20:42.873 に答える
1

他の2つの答えとして、これは良い考えではありません。正規化の提案は次のとおりです。

関税に関係なく、一部の取引が「一般的な」取引を表すようにします。詳細テーブルを 2 つに分割できます。1 つは単純な取引用で、もう 1 つは一般的な取引用です。

mysql> select * from deal_simple;
+----+----------+-----------+--------------+--------+
| id | phone_id | tariff_id | affiliate_id | active |
+----+----------+-----------+--------------+--------+
|    |       24 |         8 |            4 |      1 |
|    |       25 |         8 |            4 |      1 |
|    |       26 |         8 |            4 |      1 |
+----+----------+-----------+--------------+--------+

mysql> select * from deal_general_tariff;
+----+----------+--------------+--------+
| id | phone_id | affiliate_id | active |
+----+----------+--------------+--------+
|    |        4 |            3 |      1 |
|    |       24 |            3 |      1 |
+----+----------+--------------+--------+

次に、単純なクエリで展開された結果を得ることができます (関連phone_id 4する3 つの行を誤って含めなかったと思いますtariff_id 3, 4, 5)。

SELECT phone_id, tariff_id, affiliate_id, active
FROM deal_simple

UNION

SELECT dgt.phone_id, td.tariff_id, dgt.affiliate_id, dgt.active
FROM 
    deal_general_tariff AS dgt
  JOIN 
    tariff_data AS td
      ON td.affiliate_id = dgt.affiliate_id ;
于 2012-10-06T22:47:29.313 に答える
1

良い考えではありません。基本的な問題は、NULL がすでに 3 つの異なるものを意味しており、これが問題を引き起こしていることです。あなたは問題を尋ねています。それが表すものは次のとおりです。

  1. 不明な値 (つまり、入力されていない、存在すると予想される)。これは、NULL || を意味します。「mytext」は NULL です。
  2. 存在しないことがわかっている値 (たとえば、番地の 2 行目に NULL を使用)。これは問題ですが、回避するのは非常に困難です。Oracle 以外のプラットフォームでは、ここでは文字型に空の文字列を使用することをお勧めします。これを量っているようです。
  3. 外部結合の結果に値が見つかりません

これが意味することは、NULL 値に対処するときに備えなければならない 3 つの異なるケースが既にあり、コンテキストを使用してそれを把握する必要があるということです。意味を 2 つ、またはできれば 1 つ (outer join レコードが見つからない) に減らすことができれば、より良い結果が得られ、心配するケースが少なくなります。

もちろん、employee.hourly_wage または employee.monthy_salary のように、2 つの値のいずれかが存在すると予想される場合に問題が発生します。これはもちろん悪い例です。なぜなら、wage_or_salary に pay_unit を加えることもできるからです。しかし、問題はかなり普遍的です。多くの場合、完全な正規化と列の null の回避と、豊富な列間のデータ制約との間でトレードを行う必要があります。

于 2012-10-07T05:20:19.343 に答える
1

Not a good idea.

NULL means an unknown value. This is not the case, and using it to have a specific meaning will come back to bite you.

First of all, the convention will have to be known and remembered by anyone touching that part of the system (code and SQL).

Secondly, it is not extensible - what if you need something to represent all tarrifs with affiliate_id of 4?

Third - what do you do if you actually need to use NULL?

于 2012-10-06T20:00:26.010 に答える
0

メッセージの伝達に NULL を使用しないでください。NULL を使用して、値がないことを示します。

値がないということは、値は存在するが不明であることを意味する場合があります。このケースは Oded によってカバーされました。

この場合、値が適用できないことを意味することもあります。これは、特定のクラスのオブジェクトを記述する行がテーブルに含まれているが、そのクラスを拡張するサブクラスが複数ある場合によく発生します。一部の列は一部のサブクラスに関連する場合がありますが、他のサブクラスには関連しない場合があります。

必要に応じて、SO に「クラス テーブルの継承」というタグが付けられた手法を使用して、この最後のケースを回避できます。

データの読者が値の不在から推論を引き出す場合、彼らはそうすることができます。しかし、推論はコミュニケーションではありません。

于 2012-10-07T12:35:26.583 に答える