精华内容
下载资源
问答
  • 本文主要面向openGauss数据库初学者,帮助初学者完成一些简单的数据库管理以及GUI,设计一个简单的人力资源管理系统。本文只包含部分代码,读者需要结合自己的数据库弹性公网、数据库用户及其密码等自身信息做出...

    本文作者: 瓜西西

            本文主要面向openGauss数据库初学者,帮助初学者完成一些简单的数据库管理以及GUI,设计一个简单的人力资源管理系统。本文只包含部分代码,读者需要结合自己的数据库弹性公网、数据库用户及其密码等自身信息做出相应的修改。

    一、实验环境

    使用程序:putty.exe;

    IntelliJ IDEA 2021.1.1;

    apache-tomcat-9.0.46

    服务器名称:ecs-d8b3

    弹性公网:121.36.79.196

    端口号:26000

    表空间名:human_resource_space

    数据库名称:human_resource

    员工、部门经理登录账号:其员工ID

    员工、部门经理登录密码:123456

    人事经理登录账号:hr001

    人事经理登录密码:hr001

    登录入口(需在tomcat启动之后才能运行):http://localhost:8080/gaussdb2_war/login.jsp

    二、创建和管理openGauss数据库

    进行以下步骤前,需预先购买弹性云服务器 ECS ,并把需要的软件以及需要调用的包预先下载好。

    2.1 数据库存储管理

    2.1.1 连接弹性云服务器

    我们使用 SSH 工具PuTTY,从本地电脑通过配置弹性云服务器的弹性公网 IP地址来连接 ECS,并使用 ROOT 用户来登录。

    (1)点击putty.exe,打开putty


    (2)输入弹性公网IP,点击open,连接弹性云服务器


    2.1.2 启动、停止和连接数据库

    2.1.1.1 启动数据库

    (1)使用root登录


    (2)切换至omm操作系统用户环境

    使用语句切换至omm操作系统用户环境

    su - omm 


    (3)启动数据库

    使用语句启动数据库

    gs_om -t start 


    2.1.1.2 停止数据库

    如有需要,可以使用语句停止数据库

     gs_om -t stop 


    2.1.1.3 连接数据库

    使用 语句连接数据库。

    gsql -d dbname -p port -U username -W password -r 


    其中, -d 数据库名 -p 端口名 -U 用户名 -W 密码 -r 开启客户端操作历史记录功能


    图中使用 gsql -d postgres -p 26000 -r 连接postgres数据库。postgres 为 openGauss 安装完成后默认生成的数据库,初始可以连接到此数据库进行新数据库的创建。26000 为数据库主节点的端口号。

    2.1.3 创建和管理用户、表空间、数据库和模式

    2.1.3.1 创建用户

    使用以下语句创建用户。请牢记设置的用户名以及密码,之后需要多次使用。建议将密码都设置为相同的简单密码,方便之后的操作。

    CREATE USER user_name PASSWORD pass_word


    2.1.3.2 管理用户

    可以使用以下语句对用户进行操作:

    修改密码:

    ALTER USER a IDENTIFIED BY 'Abcd@123' REPLACE ‘Guass@123'; 


    删除用户:

    DROP USER a CASCADE;


    2.1.3.3 创建表空间

    使用以下语句创建表空间。(路径需使用单引号)

     CREATE TABLESPACE human_resource_space RELATIVE LOCATION 'tablespace/tablespace_2'; 

    创建表空间 human_resource_space,表空间路径为:tablespace/tablespace_2


    2.1.3.4 管理表空间

    (1)赋予用户表空间访问权限

    使用以下语句,数据库系统管理员将human_resource_space表空间的访问权限赋予数据用户 a

     GRANT CREATE ON TABLESPACE human_resource_space TO a; 


    (2)管理表空间

    如有需要,可以使用如下语句 或 \db 语句查询表空间。

    SELECT spcname FROM pg_tablespace;


    可使用以下语句删除表空间

    DROP TABLESPACE tablespace_1;


    2.1.3.5 创建数据库

    为用户a在表空间human_resource_space上创建数据库human_resource

     CREATE DATABASE human_resource WITH TABLESPACE = human_resource_space OWNER a; 


    2.1.3.6 管理数据库

    可以使用以下语句管理数据库:

    SELECT datname FROM pg_database; 

    或 \l 查看数据库

    DROP DATABASE testdb;

    删除数据库

    2.1.3.7 创建模式

    输入 \q 退出postgres数据库。


     gsql -d human_resource -p 26000 -U a -W aaa. -r


    连接数据库human_resource。出现如下信息则连接成功:


    使用语句

     CREATE SCHEMA a AUTHORIZATION a; 

     为用户创建同名模式a

    2.1.3.8 管理模式

     SET SEARCH_PATH TO a,public; 

    设置模式a为默认查询模式(设置中第一个为默认模式)

    如有需要,可以使用语句 \dn 查看模式 ,SHOW SEARCH_PATH; 查看模式搜索路径

    2.2 数据库对象管理实验

    2.2.1 创建表

    使用以下语句,在数据库human_resource_space,创建人力资源库的8个基本表。

    CREATE TABLE table_name

    ( col1 datatype constraint,

    col2 datatype constraint,

    coln datatype constraint );


    我们为了完成人力资源管理系统,创建雇佣历史表 employment_history 、部门表 sections、创建工作地点表 places、创建区域表 areas 、大学表 college、雇佣表 employments 、国家及地区表 states 、员工表 staffs这8个基本表。

    以员工表为例:


    2.2.2 删除表

    如有需要,可以使用

    DROP TABLE sections;

    或 

     DROP TABLE sections CASCADE ;

    语句删除表。

    2.3 数据初始化

    2.3.1 初始化数据表

    我们这里方便操作,根据给定的txt文件初始化数据表,如果不嫌麻烦,也可以使用insert语句一条一条地插入。这两种方法本质上是一样的。

    使用 

     INSERT INTO table_name \i /a.sql 

     语句初始化数据表(其中, a.sql是指定路径,执行给定的SQL脚本 )

    使用 

    SELECT * from table_name; 

     语句查看数据表信息。

    以雇佣表 employments为例:



    三、数据库应用程序开发

    常见的数据库应用程序开发步骤为:

    (1) 加载驱动

    (2) 连接数据库

    (3) 执行SQL语句

    (4) 处理结果集

    (5) 关闭连接

    我们根据这5个步骤,实现人力资源管理系统。

    3.1 项目框架


    3.1.1 BLL

    业务逻辑层,实现各项操作模块与servlet的接口,对传送数据进行逻辑判断分折,并进行传送正确的值。


    3.1.2 Model

    存放数据库表字段。在程序中,使用到的表有员工历史雇佣信息表、工作地点表、工作部门表、员工表。

    这些java文件主要作用是定义各表的set和get函数


    3.1.3 cn.UI

    实现用户界面


    3.1.4 Dao

    实现具体的对数据库的操作,其中包含具体操作的函数以及SQL语句


    3.1.4 Util

    实现获得参数并传递参数以及连接数据库的功能


    3.1.4 webapp

    存放.jsp代码,生成具体页面。其中WEB-INF中存放web.xml文件


    登录页面:


    HRmanager页面:


    manager页面:


    staff页面:


    6.2 修改表staffs

    为了实现登录功能,我们需要在员工表staffs中增加一列password,为了方便起见,我们设置密码都为123456,当然也可以自己设置差异化的密码。

    ALTER TABLE staffs ADD password varchar2(20);



    UPDATE staffs SET password = 123456;



    设置hr登录账号为hr001,密码为hr001

    6.3 加载驱动&连接数据库

    JDBC为JAVA中用来访问数据库的程序接口,我们使用JDBC连接。

    文件路径为:


    源码:

    package Util;

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.PreparedStatement;

    import java.sql.SQLException;

    import java.sql.Statement;

    public class connect { //根据用户名与密码,进行数据库的连接以及关闭连接

    private static String DBDriver="org.postgresql.Driver";

    private static String url="jdbc:postgresql://121.36.79.196:26000/human_resource";

    private static String user="a";

    private static String password="aaa";

    static Connection con=null;

    static Statement sta=null;

    static PreparedStatement pst =null;

    //创建数据库的连接

    public static Connection getConnection()

    {

    try {

    Class.forName(DBDriver);

    try {

    con = DriverManager.getConnection(url, user, password);

    return con;

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    } catch (ClassNotFoundException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

    }

    return null;

    }

    public static Statement createStatement()

    {

    try {

    sta=getConnection().createStatement();

    return sta;

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return null;

    }

    //创造预处理对象

    public static PreparedStatement createPreparedStatement(String sql)

    {

    try {

    pst = getConnection().prepareStatement(sql);

    return pst;

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return pst;

    }

    //关闭所有打开的资源

    public static void closeOperation()

    {

    if(pst ==null)

    {

    try {

    pst.close();

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    if(sta==null)

    {

    try {

    sta.close();

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    if(con==null)

    {

    try {

    con.close();

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    }


    6.4 实现具体功能

    文件路径:


    完整源码:

    package Dao;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.util.ArrayList;

    import java.util.List;

    import Model.*;

    import Util.getInformation;

    public class operate {

    //********************************登录**************************************

    //实现登录操作,登录成功返回true

    public String login(String staff_id,String password){

    if(staff_id.equals("hr001")){

    if (password.equals("hr001")){

    return staff_id;

    }else {

    return null;

    }

    }else {

    String sql="select staff_id,password from staffs ";

    ResultSet rs=Util.getInformation.executeQuery(sql);

    try {

    while(rs.next()){ //用户输入的账号密码和数据库中的信息做比较,判断输入是否正确;

    Integer id = rs.getInt("staff_id");

    String pwd = rs.getString("password");

    if(id.equals(new Integer(staff_id)) && pwd.equals(password)){

    return staff_id;

    }

    }

    rs.close();

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    return null;

    }

    //判断该员工是否为部门经理,返回部门编号

    public String isManager(String staff_id){

    String sql="select section_id,manager_id from sections";

    ResultSet rs=Util.getInformation.executeQuery(sql);

    try {

    while(rs.next()){ //用户输入的账号密码和数据库中的信息做比较,判断输入是否正确;

    Integer id = rs.getInt("manager_id");

    String section_id = rs.getString("section_id");

    if(id.equals(new Integer(staff_id))){

    return section_id;

    }

    }

    rs.close();

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return "null";

    }

    //**********************************员工操作***********************************

    //修改电话号码

    public void updatePhoneNumber(String phone_number,String staff_id){

    String sql = "update staffs set phone_number=? where staff_id=? ";

    Util.getInformation.executeUpdate(sql, phone_number, new Integer(staff_id));

    }

    //**********************************部门经理**********************************

    //查询部门所有员工信息(按员工编号升序排列)

    public List QuerySectionStaffsOrderByStaffId(Integer section_id)

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="select * from staffs where section_id=? order by staff_id asc";

    ResultSet rs=getInformation.executeQuery(sql,section_id);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    staffs staff =new staffs();

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    list.add(staff);

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //查询部门所有员工信息(按工资降序排列)

    public List QuerySectionStaffsOrderBySalary(Integer section_id)

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="select * from staffs where section_id=? order by salary desc";

    ResultSet rs=getInformation.executeQuery(sql,section_id);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    staffs staff =new staffs();

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    list.add(staff);

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //根据员工号查询部门内员工,然后返回该员工信息

    public staffs QuerySectionStaffByStaff_id(Integer staff_id,Integer section_id)

    {

    staffs staff =new staffs();

    String sql="select * from staffs where staff_id=? and section_id=?";

    ResultSet rs=getInformation.executeQuery(sql, staff_id,section_id);

    try {

    if(rs.next())

    {

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    }

    } catch (NumberFormatException | SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return staff;

    }

    //根据员工姓名查询部门内员工,然后返回该员工信息

    public staffs QuerySectionStaffByFirstName(String first_name,Integer section_id)

    {

    staffs staff =new staffs();

    String sql="select * from staffs where first_name=? and section_id=?";

    ResultSet rs=getInformation.executeQuery(sql, first_name,section_id);

    try {

    if(rs.next())

    {

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    }

    } catch (NumberFormatException | SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return staff;

    }

    public List SectionStatistics(String section_id)

    {

    ArrayList list =new ArrayList(); // 初始化

    String sql="select avg(salary),min(salary),max(salary) from staffs where section_id = ?;";

    ResultSet rs=getInformation.executeQuery(sql,section_id);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    list.add(rs.getInt("avg"));

    list.add(rs.getInt("max"));

    list.add(rs.getInt("min"));

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //******************************人事经理操作*****************************************

    //根据员工号查询员工,然后返回该员工信息

    public staffs QueryStaffByStaff_id(Integer staff_id)

    {

    staffs staff =new staffs();

    String sql="select * from staffs where staff_id=?";

    ResultSet rs=getInformation.executeQuery(sql, staff_id);

    try {

    if(rs.next())

    {

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    }

    } catch (NumberFormatException | SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return staff;

    }

    //根据员工姓名查询员工,然后返回该员工信息

    public staffs QueryStaffByFirstName(String first_name)

    {

    staffs staff =new staffs();

    String sql="select * from staffs where first_name=?";

    ResultSet rs=getInformation.executeQuery(sql, first_name);

    try {

    if(rs.next())

    {

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    }

    } catch (NumberFormatException | SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return staff;

    }

    //查询所有员工信息(按员工编号升序排列)

    public List QueryAllStaffsOrderByStaffId()

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="select * from staffs order by staff_id asc";

    ResultSet rs=getInformation.executeQuery(sql);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    staffs staff =new staffs();

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    list.add(staff);

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //查询所有员工信息(按工资降序排列)

    public List QueryAllStaffsOrderBySalary()

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="select * from staffs order by salary desc";

    ResultSet rs=getInformation.executeQuery(sql);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    staffs staff =new staffs();

    staff.setStaff_id(rs.getInt("staff_id"));

    staff.setFirst_name(rs.getString("first_name"));

    staff.setLast_name(rs.getString("last_name"));

    staff.setEmail(rs.getString("email"));

    staff.setPhone_number(rs.getString("phone_number"));

    staff.setHire_date(rs.getDate("hire_date"));

    staff.setEmployment_id(rs.getString("employment_id"));

    staff.setSalary(rs.getInt("salary"));

    staff.setCommission_pct(rs.getInt("commission_pct"));

    staff.setManager_id(rs.getInt("manager_id"));

    staff.setSection_id(rs.getInt("section_id"));

    staff.setGraduated_name(rs.getString("graduated_name"));

    staff.setPassword(rs.getString("password"));

    list.add(staff);

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    public List statistics( )

    {

    ArrayList list =new ArrayList(); // 初始化

    String sql="select avg(salary),min(salary),max(salary),section_id from staffs group by section_id;";

    ResultSet rs=getInformation.executeQuery(sql);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    list.add(rs.getInt("section_id"));

    list.add(rs.getInt("avg"));

    list.add(rs.getInt("max"));

    list.add(rs.getInt("min"));

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //查询所有部门信息

    public List QuerySectionOrderBySectionId()

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="select * from sections order by section_id asc";

    ResultSet rs=getInformation.executeQuery(sql);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    sections sections =new sections();

    sections.setSection_id(rs.getInt("section_id"));

    sections.setSection_name(rs.getString("section_name"));

    sections.setManager_id(rs.getInt("manager_id"));

    sections.setPlace_id(rs.getInt("place_id"));

    list.add(sections);

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //查询所有工作地点信息

    public List QueryPlaces()

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="select * from places";

    ResultSet rs=getInformation.executeQuery(sql);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    places places = new places();

    places.setPlace_id(rs.getInt("place_id"));

    places.setStreet_address(rs.getString("street_address"));

    places.setPostal_code(rs.getString("postal_code"));

    places.setCity(rs.getString("city"));

    places.setState_province(rs.getString("state_province"));

    places.setState_id(rs.getString("state_id"));

    list.add(places);

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    //修改部门名称

    public void updateSectionName(String section_name,Integer section_id){

    String sql = "update sections set section_name=? where section_id=? ";

    Util.getInformation.executeUpdate(sql, section_name, section_id);

    }

    //实现添加新工作地点

    public void addPlace(places place)

    {

    String sql="insert into places (place_id, street_address, postal_code, city, state_province,state_id) values (?,?,?,?,?,?)";

    Util.getInformation.executeUpdate(sql, place.getPlace_id(),place.getStreet_address(), place.getPostal_code(), place.getCity(), place.getState_province(), place.getState_id());

    }

    // 查询员工工作信息

    public List QueryStaffEmployment(String staff_id)

    {

    List list=new ArrayList(); //最终返回整个list集合

    String sql="SELECT staff_id,employment_id,section_id\n" +

    "FROM staffs\n" +

    "WHERE staff_id = ?\n" +

    "\n" +

    "UNION\n" +

    "\n" +

    "SELECT staff_id,employment_id,section_id\n" +

    "FROM employment_history\n" +

    "WHERE staff_id = ?;";

    Integer id = new Integer(staff_id);

    ResultSet rs=getInformation.executeQuery(sql,id,id);

    try {

    while(rs.next())

    {

    //保存取出来的每一条记录

    list.add(rs.getString("staff_id"));

    list.add(rs.getString("employment_id"));

    list.add(rs.getString("section_id"));

    }

    } catch (SQLException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return list;

    }

    }


    四、结果展示

    运行login.jsp进入登录界面

    4.1 以员工身份登录

    1)输入staff_id 和 正确的密码,进入员工主页面;

    输入staff_id=104,密码123456,进入员工页面


    2)在员工主页面,可以选择查看员工自己基本信息;


    3)在员工主页面,修改员工自己的电话号码;

    选择修改电话号码,填入590.423.4567


    可以重新查询,电话号码改变


    4.2 以部门经理身份登录

    1)输入staff_id 和 正确的密码,进入部门经理主页面;

    输入staff_id=103,密码123456,进入经理页面


    2)在部门经理主页面,可以查看本部门所有员工基本信息(选择按员工编号升序排列,或者按工资降序排列);

    查看本部门所有员工基本信息:

    按员工编号升序排列:


    按工资降序排列:


    3)在部门经理主页面,可以按员工编号查询员工基本信息;



    4)在部门经理主页面,可以按员工姓名查询员工基本信息;



    5)在部门经理主页面,可以统计查询本部门员工最高工资,最低工资以及平均工资;


    4.3 以人事经理身份登录

    1)输入特定编号hr001 和 特定密码,进入人事经理主页面;

    输入staff_id=hr001,密码hr001,进人事经理主页面


    2)在人事经理主页面,可以查看所有员工基本信息(选择按员工编号升序排列,或者按工资降序排列);

    按员工编号升序排列:


    按工资降序排列:


    3)在人事经理主页面,可以按员工编号查询员工基本信息;



    4)在人事经理主页面,可以按员工姓名查询员工基本信息;



    5)在人事经理主页面,可以统计各部门员工最高工资,最低工资以及平均工资;


    6)在人事经理主页面,可以查询各部门基本信息,并可以根据部门编号修改部门名称;


    修改名称:




    7)在人事经理主页面,可以各工作地点基本信息,并可以增加新的工作地点;




    8)在人事经理主页面,可以按员工编号查询员工工作信息,包括其历史工作信息,返回员工编号,职位编号和部门编号;



    五、可能遇到的问题

    5.1 Java开发工具不同:IntelliJ IDEA V.S. Eclipse

    笔者一开始使用过Eclipse,但是在后期转而使用IntelliJ IDEA,这是因为Eclipse有一些缺陷,比如报错不明显,这对于初学者而言很可能是致命的。IntelliJ IDEA的优势之一是能在右侧Database处直接连接openGauss数据库(需选择PostgreSQL数据库)。而需要注意IntelliJ IDEA只能免费试用一个月。


    5.2 连接openGauss数据库报错

    第一步连接数据库时,Eclipse出现以下报错,但是它并没有指明究竟是哪里出错。一般出现如下错误,是因为连接openGauss数据库失败,原因可能为以下几点:


    (1)url使用错误

    这里121.36.79.196为弹性公网ip,26000为端口号,human_resource为数据库名称。如果url错误,则会导致数据库无法连接。

    url="jdbc:postgresql://121.36.79.196:26000/human_resource";

    (2)数据库用户或者密码错误

    数据库用户或密码错误也会导致连接出错。所以必须牢记用户名及密码,否则容易使用错误。

    private static String user="a";

    private static String password="aaa";


    (3)java版本错误

    openGauss适用于java的版本为1.8,其他版本可能会报错。

    (4)调包出错

    连接数据库需要调用postgresql.jar包,建议提前配置jar包到项目中。

    展开全文
  • 数据库设计

    2020-05-12 20:27:00
    数据库设计的定义 数据库设计是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。数据库系统需要操作系统的支持。 数据库设计的步骤 数据库设计的设计内容包括:需求分析、...

    数据库设计的定义

    数据库设计是指根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。数据库系统需要操作系统的支持。

    数据库设计的步骤

    数据库设计的设计内容包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施和数据库的运行和维护。

    数据库设计原则

    1. 一对一设计原则 :在软件开发过程中,需要遵循一对一关系设计原则进而开展数据维护工作,通过利用此原则能够尽量减少维护问题的出现,保证数据维护工作顺利开展同时降低维护工作难度。
    2. 独特命名原则:独特命名原则的应用是为了减少在数据库设计过程中出现重复命名和规范命名现象出现。通过应用此原则能够减少数据冗杂,维护数据一致性,保持各关键词之间存在必然相对应联系。
    3. 双向使用原则:双向使用原则包括:事务使用原则和索引功能原则。双向使用原则是在逻辑工作单元模式基础上实现其表现形式的,不仅给非事务性单元操作工作提供基础保障,也保证其能够及时更新、获取数据资源。

    数据库设计的重要性

    1. 有利于资源节约
    2. 有利于软件运行速度的提高
    3. 有利于软件故障的减少
    4. 有好的扩展性,在必要时能根属据需求扩展数据结构。

    数据库设计的要求

    1. 明确用户需求:作为计算机软件开发的重要基础,数据库设计直接体现了用户的需求。
    2. 重视数据维护:过大的设计面积与过于复杂的数据是数据库设计中常见问题,因此设计师应对数据维护工作加以重视。
    3. 增加命名规范性:数据库程序与文件的命名非常重要,既要避免名称重复,还要保证数据处于平衡状态。
    4. 充分考虑数据库优化与效率的问题:考虑到数据库的优化与效率,设计师需针对不同表的存储数据采用不同的设计方式。
    5. 不断调整数据之间的关系:针对数据之间的关系进行不断调整与精简可有效减少设计与数据之间的连接,进而可为数据之间平衡状态的维持以及数据读取效率的提升提供保障。

    绘制E-R图

    1. 实体型:用矩形框,矩形框内写明实体名
    2. 属性:用椭圆型表示,并用无向边将其与相应的实体连接起来。(可以连实体,也可以连联系)
    3. 联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁边标上联系的类型。

    映射基数

    一对一:一个导师最多指导一个学生,一个学生最多被一个导师指导。
    说明导师可以不指导学生,学生也可以单干。

    多对多:一个导师可以指导任意学生,一个学生可以被任意多个导师指导。
    说明导师可以不指导学生,也可以指导好些个。学生可以单干,也可以多拜几个师傅

    一对多:一个导师可以指导任意多个学生,一个学生至多被一个导师指导。

    多对一:一个导师至多指导一个学生,一个学生可以被任意个导师指导。
    类似现在的全天一对一辅导。学生可以请多个家教,但一个家教最多只能指导一个学生

    原文链接:https://blog.csdn.net/qq_43179428/article/details/105307911

    三个范式

    1. 第一范式:在任何一个关系数据库中,第一范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。
      所谓第一范式是指数据库表的每一列(即每个属性)都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
      简而言之,第一范式就是无重复的列。

    2. 第二范式:第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式要求数据库表中的每个实例或行必须可以被唯一地区分。

    3. 第三范式:满足第三范式必须先满足第二范式。在满足第二范式的基础上,切不存在传递函数依赖,那么就是第三范式。

    展开全文
  • 这是在网上收集整理的全国最新地区数据库,精确到街道。是我目前收集整理地区数据库中最全的,可直接导入数据库即可。
  • 数据库设计原则

    千次阅读 2018-09-12 17:12:30
    前言:数据库设计在平时的工作是必不可少的,良好的表设计可以让我们查询效率更高,加快网站访问速度,提升用户体验,并且方便于我们查询数据。本篇博客就来聚焦一下,如何设计出高可复用,优良的表结构,从而在实际...

    前言:数据库设计在平时的工作是必不可少的,良好的表设计可以让我们查询效率更高,加快网站访问速度,提升用户体验,并且方便于我们查询数据。本篇博客就来聚焦一下,如何设计出高可复用,优良的表结构,从而在实际的工作中使我们写出更好的代码。

    数据库表设计的几条黄金准则:

    一:字段的原子性

    解释:保证每列的原子性,不可分解,意思表达要清楚,不能含糊,高度概括字段的含义,能用一个字段表达清楚的绝不使用第二个字段,可以用两个字段表达清楚的绝不使用一个

    字段

    二:主键设计

    解释:主键不要与业务逻辑有所关联,最好是毫无意义的一串独立不重复的数字,常见的比如UUID或者将主键设置为Auto_increment;

    三:字段使用次数

    解释:对于频繁修改的字段(一般是指状态类字段)最好用独立的数字或者单个字母去表示,不用使用汉字或者英文

    四:字段长度

    解释:建表的时候,字段长度尽量要比实际业务的字段大3-5个字段左右(考虑到合理性和伸缩性),最好是2的n次方幂值。不能建比实际业务太大的字段长度,这是因为如果字段长度过大,在进行查询的时候索引在B-

    Tree树上遍历会越耗费时间,从而查询的时间会越久;但是绝对不能建小,否则mysql数据会报错,程序会抛出异常;

    五:关于外键

    解释:尽量不要建立外键,保证每个表的独立性。如果非得保持一定的关系,最好是通过id进行关联

    六:动静分离

    解释:最好做好静态表和动态表的分离。这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家。动态表:一些频繁修改的表

    七:关于code值

    解释:使用数字码或者字母去代替实际的名字,也就是尽量把name转换为code,因为name可能会变(万一变化就会查询处多条数据,从而抛出错误),但是code一般是不会变化的.另一方面,code值存储的字符较少,也能减少数据库的压力

    八:关于Null值

    解释:不要有null值,有null值的话,数据库在进行索引的时候查询的时间更久,从而浪费更多的时间!

    九:关于引擎的选择

    解释:关于引擎的选择,innodb与myisam,myisam的实际查询速度要比innodb快,因为它不扫面全表,但是myisam不支持事务,没办法保证数据的Acid。选择哪个这就要看自己对于效率和数据稳定性方面的实际业务的取舍了

    十:资源存储

    解释:数据库不要存储任何资源文件,比如照片/视频/网站等,可以用文件路径/外链用来代替,这样可以在程序中通过路径,链接等来进行索引

    十一:与主键相关

    解释:根据数据库设计三大范式,尽量保证列数据和主键直接相关而不是间接相关

    十二:关系映射

    解释:多对一或者一对多的关系,关联一张表最好通过id去建立关系,而不是去做重复数据,这样做最大的好处就是中间的关系表比较清楚明白。

    十三:预留字段

    解释:在设计一张表的时候应该预制一个空白字段,用于以后的扩展,因为你也不是确定这张表以后不会扩展。

    十四:留下单一字段确定是否可用

    解释:通过一个单一字段去控制表是否可用,比如通常起名为isVaild,预制的含义为0为有效,1为无效,这样便于以后我们去剔除数据或者重整数据,使其成为boolean性质的数据 更加便于我们去操控。

    总结:本篇博文主要介绍了关于数据库设计的几条准则,如何设计出高可复用的数据库和条例清晰的数据库表是我们一直要关注的话题,在实际的开发中,谨遵以上的准则,起码保证自己的表设计出来的标准性,将会大大提升我们的工作效率。

    展开全文
  • 关系数据库设计核心

    千次阅读 2020-04-10 16:32:32
    1、设计一个合适的关系数据库系统的关键是关系数据库模式的设计,即应构造几个关系模式, 每个模式有哪些属性,怎样将这些相互关联的关系模式组建成一个适合的关系模型,关系数据库 的设计必须在关系数据库设计理论...

    一、关系数据库设计理论

    1、设计一个合适的关系数据库系统的关键是关系数据库模式的设计,即应构造几个关系模式, 每个模式有哪些属性,怎样将这些相互关联的关系模式组建成一个适合的关系模型,关系数据库 的设计必须在关系数据库设计理论的指导下进行。
    2、关系数据库设计理论有三个方面的内容:函数依赖、范式和模式设计。函数依赖起核心作用, 它是模式分解和模式设计的基础,范式是模式分解的标准。

    【例1】设计一个学生课程数据库,其关系模式SDSC(Sno, Sname, Age, Dept,DeptHead, Cno,Grade),各属性含义为学号、姓名、年龄、系、系主任姓名;课程号、成绩。根据实际情况, 这些属性语义规定为:
    (1)一个系有若干学生,一个学生只属于一个系。
    (2)一个系只有一个系主任。
    (3)一个学生可以选修多门课程,一门课程可被多个学生选修。 (4)每个学生学习每门课程有一个成绩
    在这里插入图片描述
    从上述语义规定和分析表中数据可以看出,(Sno, Cno)能唯一标识一个元组,所以,(Sno, Cno)为该关系模式的主码,但在进行数据库操作时,会出现以下问题。
    (1)数据冗余(2)插入异常(3)删除异常(4)修改异常

    由于存在上述问题,SDSC不是一个好的关系模式。为了克服这些异常,将S关系分解为学生关系S (Sno, Sname, Age, Dept),系关系D(Dept,DeptHead),选课关系SC(Sno, Cno,Grade),这三个关系模式的实例如表2、表3、表4所示。
    在这里插入图片描述
    在这里插入图片描述

    二、规范化

    规范化的基本思想是尽量减小数据冗余,消除数据依赖中不合适的部分,解决插入异常、删除异常和更新异常等问题,这就要求设计出的关系模式要满足一定条件。在关系数据库的规范化过程中,为不同程度的规范化要求设立的不同标准或准则称为范式。满足最低要求的称为第一范式,简称1NF,在第一范式基础上满足进一步要求的成为第二范式2NF,以此类推。
    1971年至1972年,E.F.Codd系统地提出了1NF、2NF、3NF的概念,讨论了关系模式的规
    范化问题。 1974年,Codd。和Boyce又共同提出了一个新范式,即BCNF。1976年有人提出了4NF,后又有人提出了5NF
    各个范式之间的集合关系可以表示为:
    5NF4NFBCNF3NF2NF1NF
    如下图所示:
    在这里插入图片描述
    在这里插入图片描述

    1、第一范式(1NF)

    所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域

    说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。

    在这里插入图片描述

    2、第二范式(2NF)

    在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

    第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。

    例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。(该主键的添加是在ER设计时添加,不是建库时随意添加)

    第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。
    在这里插入图片描述

    3、第三范式(3NF)

    在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
    第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式
    (2NF)。
    数据库范式而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。

    例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

    在这里插入图片描述

    4、巴斯-科德范式(BCNF)

    Boyce-Codd Normal Form(巴斯-科德范式),在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)
    巴斯-科德范式(BCNF)是第三范式(3NF)的一个子集,即满足巴斯-科德范式(BCNF) 必须满足第三范式(3NF)。通常情况下,巴斯-科德范式被认为没有新的设计规范加入,只是 对第二范式与第三范式中设计规范要求更强,因而被认为是修正第三范式,也就是说,它事实上是对第三范式的修正,使数据库冗余度更小。这也是BCNF不被称为第四范式的原因。某些书上, 根据范式要求的递增性将其称之为第四范式是不规范,也是更让人不容易理解的地方。而真正的第四范式,则是在设计规范中添加了对多值及依赖的要求。

    【目的原则】

    规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小。便于插入、删除和更新。遵从概念单一化“一事一地”原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。
    一个关系模式接着分解可以得到不同关系模式集合,也就是说分解方法不是惟一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空问,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。

    【反范式(了解)】

    规范化的优点是明显的,它避免了大量的数据冗余,节省了存储空间,保持了数据的一致性。当一个库里的数据经常发生变化时,达到3NF的库可以使用户不必在超过两个以上的地方更改同 一个值。那么是不是只要把所有的表都规范为3NF后,数据库的设计就是最优的呢?这可不一定。范式越高意味着表的划分更细,一个数据库中需要的表也就越多,用户不得不将原本相关联的数据分摊到多个表中。当用户同时需要这些数据时只能采用连接表的形式将数据重新合并在一起。同时把多个表联接在一起的花费是巨大的,尤其是当需要连接的两张或者多张表数据非常庞大的时候,表连接操作几乎是一个噩梦,这严重地降低了系统运行性能。

    展开全文
  • 地区级联获取问题 数据库设计

    千次阅读 2012-08-19 19:54:54
     像这种方式设计表的,如果我想取出成都下边所有的地区只能有循环递归的方式取出:  1.先取出成都的记录,  2.再查成都下一级的区域。上级编号(parentid)是成都(2)的记录,查询出编号(id)为5,6,7的记录
  • 数据库设计指南

    千次阅读 2016-07-03 09:04:09
    数据库设计指南  如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也...
  • 用云计算数据库进行的数据库设计论文 摘要云计算数据库涉及机房服务器工程师工作人员等多个因素需要实现垮地区跨部门之间的高效,协同工作云计算数据库作为建立在互联网之上的新一代基础设施近年来在国内外引起了注意...
  • 数据库设计----概念结构设计   1>将需求分析得到的用户需求抽象为信息结构,这个信息结构就是概念设计。 概念设计的过程就是概念结构设计 它是整个数据库设计的关键。   2>概念设计的主要特点:...
  • 基于MAPGIS的诸广地区地学信息数据库设计
  • 数据库设计范式

    2012-11-15 07:49:44
    设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式...
  • 点餐系统——数据库设计

    千次阅读 2018-10-11 11:53:52
    一、 数据库设计 1.用户表         字段 字段类型 字段描述 备注 U_ID Int   ...
  • 在大学学习数据库的时候,不明白为什么会学习很多关系代数、设计范式的理论。但是,有了这些理论基础,在遇到问题的时候脑袋会有灵光一闪的感觉。那种感觉很像是大雾天太阳照射大地的感觉,心中一片光亮。^_^ 那么,...
  • 数据库设计第三章

    2013-09-05 16:18:15
    北大青鸟ACCP6.0优化MySchool数据库设计第四章上机练习
  • 关系数据库设计范式

    2013-10-03 21:54:40
    关系数据库设计范式   简介  设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。  目前关系数据库有...
  • 设计原则范式 之 数据库设计三范式

    千次阅读 2013-12-30 08:13:43
    设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式...
  • 数据库设计之规范化和反规范化

    千次阅读 2019-09-09 20:50:36
    数据库设计的规范化能够经常被提及,但是反规范化很少被涉猎。实际应用中反规范化应用的场景很多。本文主要介绍一下数据库的反规范化。 一、规范化 常见的规范化有数据库设计的三范式。 1NF 是最低的规范化要求。...
  • 数据库设计原则和优化

    千次阅读 2018-12-12 20:37:57
    数据库设计原则:   1. 原始单据与实体之间的关系   可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。  在特殊情况下,它们可能是一对多或多对...
  • 转:数据库设计

    2011-11-09 13:26:17
    为什么需要设计数据库  这里我们思考两个问题: ...因为,良好的数据库设计能够: q 节省数据的存储空间 q 能够保证数据的完整性 q 方便进行数据库应用系统的开发 糟糕的数据库设计: q 数据
  • SQL Server数据库设计规范

    千次阅读 2017-06-16 16:25:40
    数据库设计规范 1.简介 数据库设计是指对一个给定的应用环境,构造最优的数据库模式,建立数据库及其他应用系统,使之能有效地存储数据,满足各种用户的需求。数据库设计过程中命名规范很是重要,命名规范合理的...
  • 大学生就业管理系统数据库设计设计内容: (1)主要的数据表 用人单位基本信息表,专业信息表,地区代码表等等。 (2)主要功能模块 1)对用人单位的基本信息进行录入、修改、删除等。 2)实现毕业生专业信息的维护。 3)...
  • 省市区级联数据库设计。全国的省,各省的市、区都有。仅作为SQL建表数据。 省市区级联数据库设计。全国的省,各省的市、区都有。仅作为SQL建表数据。 省市区级联数据库设计。全国的省,各省的市、区都有。仅作为SQL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,066
精华内容 19,626
关键字:

不同地区数据库设计