SQL组合键值与字符串

时间:2017-05-28 18:43:05

标签: sql primary-key composite-primary-key

我有一个从1到N个元素的整数列表(N <24)

目前,有两种解决方案可以在SQL数据库中管理这个值(我认为它与MySQL和Microsoft SQL Server相同)

解决方案1 ​​:使用VARCHAR,分隔整数值:

 aaa | 40,50,50,10,600,200
 aab | 40,50,600,200
 aac | 40,50,50,10,600,200,500,1

解决方案2 :使用复合主键(key,id)创建一个新表(id =列表中元素的索引)和值:

  aaa | 0 | 40
  aaa | 1 | 50
  aaa | 2 | 50
  ....
  aab | 0 | 40
  aab | 1 | 50
  aab | 2 | 600
  ....

考虑到要加载许多数据项并且需要多次刷新此数据,它有什么更好的解决方案

由于

编辑: 我的操作案例是:我需要刷新/读取所有数据(密钥列表)同一个呼叫,我从来没有逐个调用,这就是为什么我认为第一种方法更好。 所有数学如avg或max我想在客户端做。

2 个答案:

答案 0 :(得分:2)

通常第二种方法更可取。一个优点是易于访问:

-- Third value of aaa
select value from mytable where key = 'aaa' and pos = 3;

-- Avarage value of aaa
select avg(value) from mytable where key = 'aaa';

-- Avarage number of values
select avg(cnt) from (select count(*) as cnt from mytable group by key) counted;

另一个是数据一致性。您可以向列添加简单约束,例如,仅允许1到700之间的整数,最多只能放置23个。

但上述情况有例外。如果您仅使用数据库按原样存储列表,并且您不想选择单独的值甚至聚合它们,即如果这只是DBMS的字符串而您的查询并不关心它内容,然后将其存储为一个简单的字符串。为什么不呢?

答案 1 :(得分:1)

你提出的第二个解决方案是这样做的经典方法,我建议你这样做。

第一种解决方案在缩放和其他一百种方面非常糟糕