2013-03-21 38 views
1

我有这样的表:mysql的从具有表中的多个键值对的单场关键的选择值

服务:

+----+-----------+------------+-------------+ 
| id | name  | service_id | description | 
+----+-----------+------------+-------------+ 
| 1 | CHAT  |  1  |    | 
| 2 | SMS  |  1  |    | 
+----+-----------+------------+-------------+ 

service_features:

+----+------------+------------+-------------+ 
| id | service_id | name  | description | 
+----+------------+------------+-------------+ 
|10 |   1 | Audio  |    | 
|20 |   1 | Video  |    | 
|30 |   2 | BULKSMS |    | 
+----+------------+------------+-------------+ 

client_services:

+----+-----------+------------+----------------------------------+---------------------------------------------+ 
| id | client_id | service_id |service_features_id    |service_values        | 
+----+-----------+------------+----------------------------------+---------------------------------------------+ 
|100 |  1000 |   1 |features:{10:enable, 20:disable} |values:{data_transfer:102400, quota:204800} | 
|200 |  1001 |   2 |features:{30:enable}    |values:{total_sms:100000, users:800}   | 
|300 |  1001 |   1 |features:{10:disable, 20:enable} |values:{quota:204800}      | 
+----+-----------+------------+----------------------------------+---------------------------------------------+ 

现在,我只需要从mysql select查询中获取任何密钥的服务值,即data_transfer或client_id 1000的配额。 答案应该分别为102400或204800

是否有任何更好的方式来形式化表格或存储信息。请建议。

+0

怎样的特征值涉及到service_features?例如,您如何知道data_transfer和quota是如何处理的?你一定要规范化数据,但我们需要更多地了解关系如何工作。 – Tom 2013-03-21 12:50:26

+0

@Tom:将列名称编辑为service_values,并且我们将客户端与service_id – Mangesh 2013-03-21 13:04:28

回答

1

绝对有更好的办法。您的模式需要两个表,client_services_featuresclient_services_values,而不是client_servicesclient_services_features有这样的栏目:

  • ID
  • CLIENT_ID
  • services_id
  • service_feature_id
  • 的IsEnabled

而且client_services_values具有如柱:

  • ID
  • CLIENT_ID
  • services_id
  • 值名称
  • value_value

无论何时你发现这是不使事情列出一排表结构时,通常要创建一个单独的表列表。当列表包含id时,您总是希望为列表创建一个分离表。

0

存储列中的值,json或xml列表使查询特定数据非常困难。将数据分成不同的行通常会更好。

我会让其他两个表

client_services_values:

+----+-----------+------------+---------------------------------+ 
| id | client_id | service_id |service_type | service_value | 
+----+-----------+------------+---------------------------------+ 
|1 |  1000 |   1 |data_transfer | 102400   | 
|2 |  1000 |   1 |quota   | 204800   | 
|3 |  1001 |   2 |total_sms  | 100000   | 
|4 |  1001 |   2 |users   | 800    | 
|5 |  1001 |   1 |quota   | 204800   | 
+----+-----------+------------+---------------------------------+ 

和client_features

+----+-----------+------------+-----------------+ 
| id | client_id | feature_id | feature_value | 
+----+-----------+------------+-----------------+ 
|1 |  1000 |   10 |enable   | 
|2 |  1000 |   20 |disable   | 
|3 |  1001 |   30 |enable   | 
|4 |  1001 |   10 |disable   | 
|5 |  1001 |   20 |enable   | 
+----+-----------+------------+-----------------+ 
相关问题