数据库学习笔记——关系数据理论

规范化

定义6.1 设R(U)是属性集U上的关系模式,X,Y为U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称X函数确定Y或Y函数依赖于X,记作\(X\rightarrow Y\)

例如X为人名,Y为该人的性别

定义6.2 在R(U)中,如果\(X\rightarrow Y\),并且对X的任何一个真子集X',都有\(X'\not\rightarrow Y\),则称Y对X完全依赖,记作\(X\stackrel{F}{\rightarrow}Y\).

\(X\rightarrow Y\),但Y不完全依赖于X,则称Y对X部分函数依赖,记作\(X\stackrel{P}{\rightarrow}Y\).

阅读全文 »

SQL学习笔记(三)——数据库的完整性

关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库完整性。

实体完整性

定义实体完整性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 将Student表中Sno属性定义为码(主键)
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20));

-- 将SC表中Sno、Cno属性组定义为码
CREATE TABLE Student
(Sno CHAR(9) NOT NULL,
CnO CHAR(4) NOT NULL,
Grade SMALLINT,
PRIMARY KEY(Sno,Cno));
阅读全文 »

SQL学习笔记(二)

数据库安全性

授权与收回

GRANT

1
2
3
4
5
GRANT <权限>[,<权限>]...
ON <对象类型><对象名>[,<对象类型><对象名>]...
TO <用户>[,<用户>]...
[WITH GTANT OPTION];
-- WITH GRANT OPTION表示获得了某种权限的用户还可以把这种权限授予其他用户,但不能循环授予
阅读全文 »

SQL学习笔记(一)

学习示例

Student

Sno Sname Ssex Sage Sdept
201215121 李勇 20 CS
201215122 刘晨 19 CS
201215123 张敏 18 MA
201215125 张立 19 IS

Course

阅读全文 »

自制3D打印机SUPERCUBE:第一篇:原材料采购

SUPERCUBE

选择supercube主要是i3的y轴在底板的有时可能会不稳,框架式的后期加装亚克力板整体也会好看一些,而且会有拓展性(例如挤出头换笔或者激光头)

um2看着也很好,但是我还算是新手,难度有点大,预算也稍高一点

阅读全文 »

C++:单例封装log4cpp

log4cpp是一个开源C++日志类库,可以方便使用日志和调试。

官方主页

安装

1
2
3
4
5
6
7
8
9
#1.官网下载压缩包
#2.解压
tar zxvf log4cpp-x.x.x.tar.gz
cd log4cpp/
#安装
./configure
make
make check
sudo make install

默认lib库路径:/usr/local/lib/

阅读全文 »

C++:让一个类只能在堆/栈上创建对象

在C++中,类的对象创建有两种形式,一是静态创建,如A a;另一种是动态创建,如A *p=new A;

静态创建一个类对象,是由编译器为对象在栈空间中分配内存。

动态创建对象,是使用new运算符将对象创建在堆空间中。

动态创建又分为两步:

  1. operate new()函数在堆空间找到合适内存并分配

  2. 调用构造函数构造对象,初始化内存空间

operate new()

在说创建对象前,先聊一下operate new()的重载。

如果不想使用系统原始的内存分配方式时,可以自定义内存分配方式。

阅读全文 »

C++:空指针访问类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using std::cout;
using std::endl;

class NullPointerCall
{
public:
void func1()
{ cout << "func1()" << endl; }

void func2(int ix)
{ cout << "ix = " << ix << endl; }

void func3(/* NullPointerCall* const this */)
{ cout << "_ix = " << this->_ix << endl; }

private:
int _ix;
};


int main(void)
{
NullPointerCall * p = nullptr;
p->func1();//NullPointerCall::func1(p);
p->func2(10);// NullPointerCall::func2(p, 10);
//p->func3();//error p->func3(p);

NullPointerCall np;
np.func1();//NullPointerCall::func1(&np);
np.func2(10);
np.func3();//np.func3(&np);
return 0;
}

C++:单例模式

单例模式简单来说就是整个程序运行时只能创建出一个对象。

核心办法:构造函数私有化

单例模式还分为两种:饿汉模式和饱汉模式

饿汉模式:程序运行直接创建对象(线程安全)

饱汉模式:使用对象时,若不存在创建对象(线程不安全)

双检测锁:解决饱汉模式线程不安全问题

饱汉模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Singleton
{
public:
static Singleton * getInstance()
{
if(_pInstance == nullptr)
{
_pInstance = new Singleton();
}
return _pInstance;
}

static void free()
{
if(_pInstance)
{
delete _pInstance;
}
}

void print() const
{ cout << "Singleton::print()" << endl; }

private:
Singleton(){ cout << "Singleton()" << endl; }
~Singleton() { cout << "~Singleton()" << endl; }

static Singleton * _pInstance;
};

//静态变量必须类外静态初始化
Singleton * Singleton::_pInstance = nullptr;

饿汉模式

阅读全文 »

C++:lambda表达式

lambda表达式其实就是匿名函数,即没有函数名的函数

形式

1
[capture list](parpmeter list)->return type{funcition body}
  • capture list(捕获列表)是一个lanbda所在函数中定义的局部变量的列表(通常为空)
阅读全文 »
0%