0

私は携帯電話と料金表のデータベーステーブルを設計しました。

複数のモバイルネットワーク、販売タイプ、および関連するアフィリエイトをサポートする必要があります。

ポイント(オペレーター向け)は、選択した電話、料金、ネットワーク、販売タイプによって異なります。

価格プランの例:

T-Mobile消費者向けアップグレード

  • サムスンギャラクシーS3
  • 料金:スーパーワン(月額料金:$ 12.00)
  • 「RetailerOne」とのこの販売アフィリエイト
  • 合計ポイント:3.3

T-Mobileコンシューマーの新しい接続

  • サムスンギャラクシーS3
  • 料金:スーパーワン(月額料金:$ 35.00)
  • この販売アフィリエイトは「小売業者2」と提携しています
  • 合計ポイント:7.3

AT&T:'Sim Only Deal'(電話なし)

  • 料金:X-Deal Two(月額費用:$ 18.00)
  • 「RetailerOne」とのこの販売アフィリエイト
  • 合計ポイント:10.0

以下のテーブルデザインを参照してください。これはどのように行われるべきですか?またはそれをどのように改善できますか?

データベース設計:

CREATE TABLE IF NOT EXISTS `affiliate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `affiliate` (`id`, `name`) VALUES
(1, 'Retailer One'),
(2, 'Retailer Two');

CREATE TABLE IF NOT EXISTS `network` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `network` (`id`, `name`) VALUES
(1, 'T-Mobile'),
(2, 'AT&T');

CREATE TABLE IF NOT EXISTS `network_saletype` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `network_id` int(11) NOT NULL,
  `saletype_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `network_saletype` (`id`, `network_id`, `saletype_id`) VALUES
(1, 1, 1),
(2, 2, 3);

CREATE TABLE IF NOT EXISTS `phone` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `description` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


INSERT INTO `phone` (`id`, `name`, `description`) VALUES
(1, 'Samsung Galaxy S3', ' Quad-core, NFC, AMOLED'),
(2, 'Apple iPhone 4S', 'A5 chip, 8MP camera, Siri voice');

CREATE TABLE IF NOT EXISTS `phone_points` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone_id` int(11) NOT NULL,
  `tarrif_id` int(11) NOT NULL,
  `affilicate_id` int(11) NOT NULL,
  `point` float NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `phone_points` (`id`, `phone_id`, `tarrif_id`, `affilicate_id`, `point`) VALUES
(1, 1, 1, 1, 3.3),
(2, 1, 2, 2, 7.3);

CREATE TABLE IF NOT EXISTS `saletype` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `saletype` (`id`, `name`) VALUES
(1, 'Consumer Upgrade'),
(2, 'Consumer New Connection'),
(3, 'Sim-Only Deal');


CREATE TABLE IF NOT EXISTS `tariff_point` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tarrif_id` int(11) NOT NULL,
  `affilicate_id` int(11) NOT NULL,
  `point` float NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `tariff_point` (`id`, `tarrif_id`, `affilicate_id`, `point`) VALUES
(3, 3, 1, 10);

CREATE TABLE IF NOT EXISTS `tarrif` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `network_saletype_id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `tariff_duration` int(11) NOT NULL,
  `monthly_cost` decimal(6,2) NOT NULL,
  `description` varchar(150) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `tarrif` (`id`, `network_saletype_id`, `name`, `tariff_duration`, `monthly_cost`, `description`) VALUES
(1, 1, 'Super One', 12, '12.00', '200 Mins, 400 Texts, 500MB Internet'),
(2, 1, 'Super One', 12, '35.00', '200 Mins, 400 Texts, 500MB Internet'),
(3, 2, 'X-Deal Two', 12, '18.00', '');

結果

mysql> select * from network;
+----+----------+
| id | name     |
+----+----------+
|  1 | T-Mobile |
|  2 | AT&T     |
+----+----------+

mysql> select * from affiliate;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | Retailer One |
|  2 | Retailer Two |
+----+--------------+

mysql> select * from saletype;
+----+-------------------------+
| id | name                    |
+----+-------------------------+
|  1 | Consumer Upgrade        |
|  2 | Consumer New Connection |
|  3 | Sim-Only Deal           |
+----+-------------------------+

mysql> select * from network_saletype;
+----+------------+-------------+
| id | network_id | saletype_id |
+----+------------+-------------+
|  1 |          1 |           1 |
|  2 |          2 |           3 |
+----+------------+-------------+


  mysql> select * from tarrif;
+----+---------------------+------------+-----------------+--------------+-------------------------------------+
| id | network_saletype_id | name       | tariff_duration | monthly_cost | description                         |
+----+---------------------+------------+-----------------+--------------+-------------------------------------+
|  1 |                   1 | Super One  |              12 |        12.00 | 200 Mins, 400 Texts, 500MB Internet |
|  2 |                   1 | Super One  |              12 |        35.00 | 200 Mins, 400 Texts, 500MB Internet |
|  3 |                   2 | X-Deal Two |              12 |        18.00 |                                     |
+----+---------------------+------------+-----------------+--------------+-------------------------------------+

mysql> select * from  tariff_point;
+----+-----------+---------------+-------+
| id | tarrif_id | affilicate_id | point |
+----+-----------+---------------+-------+
|  3 |         3 |             1 |    10 |
+----+-----------+---------------+-------+

mysql> select * from  phone;
+----+-------------------+---------------------------------+
| id | name              | description                     |
+----+-------------------+---------------------------------+
|  1 | Samsung Galaxy S3 |  Quad-core, NFC, AMOLED         |
|  2 | Apple iPhone 4S   | A5 chip, 8MP camera, Siri voice |
+----+-------------------+---------------------------------+

mysql> select * from phone_points;
+----+----------+-----------+---------------+-------+
| id | phone_id | tarrif_id | affilicate_id | point |
+----+----------+-----------+---------------+-------+
|  1 |        1 |         1 |             1 |   3.3 |
|  2 |        1 |         2 |             2 |   7.3 |
+----+----------+-----------+---------------+-------+

編集:私の質問は、電話、タリフ、ネットワーク、saleTypeの間の関係の設計は大丈夫ですか?基本的に、オペレーターは小売業者を選択し、次にモバイルネットワークを選択します。次に、販売の種類(例:消費者向けアップグレード)を選択し、関連する料金の電話を選択します。選択したタリフや電話に応じて、オペレーターはポイント数を取得します。

4

1 に答える 1

2

この表は、2、5、または1,847のアフィリエイトが同じ名前を持っていても問題がないことを示しています。

CREATE TABLE IF NOT EXISTS `affiliate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

これらのインサートは機能します。彼らはおそらくすべきではありません。

INSERT INTO `affiliate` (`id`, `name`) VALUES
(1, 'Retailer One'),
(2, 'Retailer One'),
(3, 'Retailer One'),
(4, 'Retailer One'),
(5, 'Retailer One');

問題は、意味のない(代理)整数を主キーとして定義しているのに、それが何の代理であるかを定義していないことです。これらのすべてのテーブルには、サロゲートID番号以外の列の組み合わせに対して一意の制約が必要です。

また、外部キーをまったく定義していません。これはほぼ間違いなく間違いです。

このような挿入ステートメントが成功すると、やるべきことがあります。

insert into phone_points values (1078, 3000, 2743, 10234, -33344.03);
于 2012-09-17T18:42:41.223 に答える