业务:
有1大批基因,按2中方式分类:1类是按 功能,另1类是按 代谢途径。
此外,1个基因可能同属于多个功能、或者多个代谢途径。
平时主要是通过 功能、或代谢途径 获得相应类别下的所有基因,或者查询某个基因给出相应的代谢途径或功能。
想法:
我想到了2种分表方式,但不知道哪一种更好,所以想请大家给我点建议,甚至提出更好的分表方式更欢迎。我还有想知道一般数据库的性能测试一般都怎么做的呢?有一些经验或者书可以推荐的话那就更好了,先事先感谢大家的关注。
---方式1
1. 表1 代谢途径:category_id(index,自增) / name 类名
2. 表2 基因功能:category_id(index,自增) / name 类名
3. 表达 基因:gene_id(index,用唯一的通用的ID名,不一定自增) / category_id(对应上面的功能、或代谢途径) / type(1代表对应代谢途径,2代表对应基因功能的id)
此方式在此方式搜寻或者join的时候,仅能 用 ON 代谢途径/基因功能.category_id = 基因.category_id 衔接后,加一个where 基因.type=1/2。
---方式2
1. 表1 代谢途径:
/ category_id(index,自增)
/ name 类名
2. 表2 基因功能:
/category_id(index,自增)
/ name 类名
3. 表达 基因:
/gene_id(index,用唯一的通用的ID名,不一定自增)
/category_id(以num-category_id形式储存,如{1-category_id};或是{2-category_id};category_id对应上面的功能、或代谢途径中的id;前面的1代表对应代谢途径,2代表对应基因功能的id)
此方式搜寻或者join的时候可以 用 ON 代谢途径/基因功能.concat('1或者2', '-', category_id) = 基因.category_id 链接到一起
1
msg7086 2015-08-13 11:32:32 +08:00 1
虽然不知道能不能回答你的问题。
不过很多时候用JOIN本身效率不一定高。 特别是对于复杂的表连接来说。 以及简单的请求更容易被cache缓存住。 另外建议说一下数据的规模? |
2
ekeyme OP @msg7086 嗯。首先非常感谢。如果不用join的话,那就是先select出一部分条件在select么?另外,我在数据库上很多东西还是不熟悉,你问的数据规模是怎么表示呢? 我这里gene那个数据库中有7万条记录,一个库中所有表的数据加起来 达到1G上。
|
4
msg7086 2015-08-13 13:27:16 +08:00
主要是我没看明白你表到底是怎么存放数据的。
你可以考虑先把要存的数据写出来,给点例子,这样比较方便看。 1G的数据量很小,大多数时候稍微优化一下就能跑得飞快了。 关于性能调优,如果你有生产环境的话,当然是放到生产环境来测试最方便。 如果没有的话,一般用explain去看查询计划,看看是不是都用了索引了。 另外,由于通常短小的查询更容易被cache,所以做两次或者三次select或许会更快。 当然具体还是要看实际的业务情况来定。 时间不早先睡了,如果问题没有解决的话,明天上班的时候我会再来回复。 |
5
JamesRuan 2015-08-13 14:22:16 +08:00
都不是正确的方法。你应该去学学数据库范式。
最先应该弄清楚的是数据之间的关系:基因和功能,基因和代谢途径是互相有交叉的多对多的关系: 同一个基因可以有多个功能: gene_id(one) -> function_id(many) 同一个基因可以参与多个代谢途径: gene_id(one) -> pathway_id(many) 同一个功能有多个基因: function_id(one) -> gene_id(many) 同一个代谢途径有多个基因: pathway_id(one) -> gene_id(many) 你需要上面四张表去记录数据间的关系,少一张不行。 |