1.先说前提:
使用spring boot搭建的spring应用;
使用了Hibernate,在pom中添加了spring-boot-starter-data-jpa;
数据库是MySql;
开发工具是IDEA。
我以前没有做过web开发,对数据库也了解的也不多,所以我下面要说的,如果有不现实或者实现方式不好的情况,希望大家不吝赐教,多谢!!
2.想达到的需求:
比如说,
我这个数据库中要录入多个学校的若干个学生的信息。
数据量可能非常大,我不想把那么多学生信息放在同一个表中。
我的设想是,
每一所学校一个“XX学校学生信息表”(tbl_School_XX,比如“tbl_School_01”),然后把该校学生的信息录入到那个表中。
应用本身学校索引表(tbl_School_Index),这个表中有一个索引字段(比如index)来存各个学校的表名(比如“tbl_School_01”)。
·当要录入新的学校的学生信息,则在添加学校时,应用会自动生成一个新的“XX学校学生信息表”,应用会自动起好表名(比如“tbl_School_01”),用这个新表来存新学校的学生的信息。同时,这个表名也会添加到学校索引表(tbl_School_Index)的索引字段(index)。
·当要读取学生信息,或者当要录入现有学校的新学生信息时,则会从学校索引表(tbl_School_Index)中找出索引字段(index)中的数据(比如“tbl_School_01”),然后读/写表tbl_School_01。
如图
3.我目前遇上的困难是:
(1)我知道关系型数据库不允许表中表,所以才想出这么一种办法,不知道是否可行,或者说,是否恰当。
(2)当我新建一个实体类(@Entity)时,配置好属性和get/set方法后,运行应用,会在数据库中生成对应的一个表,可是我不需要生成那个表,我是需要当添加学校时,动态的生成对应那个实体类的表。
4.其他想法
我有想过把几个学校的所有学生的信息放在一个表中,然后在那个表里添加一个“学校”字段来标注该学生是哪所学校的,但是我怕当数据量变大时,这个表的使用会出各种问题。
5.我说的可能有点啰嗦,多谢各位认真看完,望能指点迷经,多谢!
学习ing2017-07-05 10:48:15
当要录入新的学校的学生信息,则在添加学校时,应用会自动生成一个新的“XX学校学生信息表”,应用会自动起好表名(比如“tbl_School_01”),用这个新表来存新学校的学生的信息。同时,这个表名也会添加到学校索引表(tbl_School_Index)的索引字段(index)。
首先根据你目前的描述(目前的描述没有涉及到一些需要跨表之类的操作)这种方式是可行的,当添加学生时,如果学校不存在,需要插入学校索引,并新建相关表然后插入学生信息,这个可以用代码实现(这是在不重启应用的情况下),不重启应用的情况下,用配置我不知道能否实现,如果有人知道,麻烦告知,谢谢。
(2)当我新建一个实体类(@Entity)时,配置好属性和get/set方法后,运行应用,会在数据库中生成对应的一个表,可是我不需要生成那个表,我是需要当添加学校时,动态的生成对应那个实体类的表。
你这里说的是应用可以重启,如果应用可以重启,那是可以通过配置来插入数据,并且自动建表的。需要对hibernate进行配置,并把相应SQL的脚本放到resources下面就可以了。
application.properties中hibernate的配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
# 1
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
# 2
spring.jpa.show-sql=true
sql脚本存放