0

我設計了手機數據庫表&關稅。電話資費網站的ERD - 這是最佳的嗎?

它應該支持多種移動網絡,銷售類型和相關聯盟。

積分(對於運營商)取決於所選的電話,資費,網絡和銷售類型。

例價格計劃:

T-Mobile的消費升級

  • 三星Galaxy S3
  • 關稅賽:超級(每月費用:$ 12.00)
  • 這'Retailer One'銷售子公司
  • 共點:3.3

T-Mobile的消費者新建連接

  • 三星Galaxy S3
  • 關稅賽:超級(每月費用:$ 35.00)
  • 此次出售子公司與'零售商2'
  • 總分數:7.3

AT &牛逼: '唯一的SIM卡交易'(沒有電話)

  • 關稅:X-兩個處理(每月費用:$ 18.00)
  • 此次出售子公司與 '零售商一個'
  • 總點數: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之間的關係,設計好不好?基本上,運營商可以選擇一個零售商,然後選擇移動網絡..然後選擇什麼類型的銷售(例如:消費者升級),然後選擇具有相關相關資費的電話。根據他們選擇的目標和/或電話 - 運營商獲得點數。

+0

小點,'affilicate_id'和'tarrif_id'拼錯。此外,關稅和產品說明中還包含CSV字符串,如果您想設置比較功能,則可能需要將它們分解爲更多單獨的表格。 – halfer

+0

謝謝你讓我知道這個拼寫錯誤..我知道關於tarrif的描述,謝謝。我不需要打破這些。 –

+0

交叉發佈在DBA.se http://dba.stackexchange.com/questions/24434/mobile-phone-tariffs – Taryn

回答

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); 
+0

感謝您的建議。我從來沒有真正使用外鍵進入habbit ..我已經更新了我的問題。他們的關係可以嗎? –

+2

關係好嗎?不,沒有外鍵。事實上,沒有外鍵聲明,我們不知道你認爲關係*是*。 –

相關問題