首页 > 编程技术 > php

数据库设计技巧(三)

发布时间:2016-11-25 16:42

在定义第四个正规化的形式前,我想首先提一下三种基本的数据关系:一对一,一对多和多对多。我们回头看一下经
过第一个正规化的users表。要是我们将url的字段放在一个独立的表中,每次在users表中插入一个记录,我们就会在urls
表中插入一行。我们将得到一个一对一的关系:用户表中的每一行,都将在urls表中找到相应的一行。对于我们的应用来
说,这既不实用也不标准。
  然后看看第二个正规化的例子。对于每个用户记录,我们的表格允许有多个urls的记录与之关联。这是一个一对多的
关系,这是一个很常见的关系。
  对于多对多的关系来说,就有点复杂了。在我们的第三个正规化形式的例子中,我们的一个用户与很多的url有关,而
我们想将该结构变为允许多个用户与多个的urls有关,这样我们就可以得到一个多对多的结构。在讨论前,我们先看看表
格结构会有些什么变化
  users
  userId name relCompId
  1 Joe 1
  2 Jill 2
  companies
  compId company company_address
  1 ABC 1 Work Lane
  2 XYZ 1 Job Street
  urls
  urlId url
  1 abc.com
  2 xyz.com
  url_relations
  relationId relatedUrlId relatedUserId
  1 1 1
  2 1 2
  3 2 1
  4 2 2
  为了进一步减低数据的冗余,我们运用第四级正规化形式。我们创建了一个颇奇怪的url_relations表,里面的字段均
为主键或者foreign key。通过这个表,我们就可以消除urls表中的重复项目。以下是第四个正规化形式的具体要求:
  第四个正规化形式
  1.在一个多对多的关系中,独立的实体不能存放在同一个表格中
  由于它仅应用于多对多的关系,因此大多数的开发者可以忽略这条规定。不过在某些情况下,它是非常实用的,这个
例子就是这样,我们通过将相同的实体分离出来,并且将关系移到它们自己的表格中,从而改进了urls表格。
  为了令你更容易明白,我们举个具体的例子,以下将用一个SQL语句选择出所有属于joe的urls:
  SELECT name, url FROM users, urls, url_relationsswheresurl_relations.relatedUserId = 1 AND
users.userId = 1 AND urls.urlId = url_relations.relatedUrlId
  如果我们想要遍历每个人的个人信息和url信息,我们可以这样做:
存取数据
select语句
1. 选择表中的所有列
“*”对Select语句有特殊意义。它指定表中的所有列,而不用列出列的名字。列的顺序和表中的顺序相同。
2. 选择不同的值
如果被选择列表中的列有重复值,这时“distinct”关键字可以用来忽略重复值。
注意: 如果Select list中多于一列,则distinct关键字对它们总体有效。如果一列有重复值,而其他列的值是唯一的,则有重复值的一列包含在结果中。
3. 在结果数据集合中对列重命名
结果中列的默认名字是源数据库中的列名,用户可以用自己指定的列名来代替默认的列名。
Select AuthorFirstName = au_fname from authors
--将列名由“au_fname”改成“AuthorFirstName”
4. 选择计算值
在Select list中可以包含计算值或常量。计算值是在算术表达式的基础上计算而来的,它可包含在表中的一列或多列。
Select totalSale = price * ytd_sales from titles
条件选择(Where子句)
使用一个比较或逻辑操作在Where子句中指定过滤条件,来生成表中想得到的行。
1. 比较操作
比较操作能比较数值、字符和日期数据,返回TRUE或FALSE。
比较操作符
<(小于)
>(大于)
=(等于)
<>(不等于)
>=(大于等于)
<=(小于等于)
!=(不等于)
!<(不小于)
!>(不大于)
2. 逻辑操作
逻辑操作测试某些条件是否正确,并根据测试结果返回TRUE或FALSE。
· LIKE 如果操作和指定的字符串相同,则返回TRUE,指定的字符串也可包含通配符。
有通配符的like操作更有用。
· “%”规定所有字符串可代替字符“%”的位置。任何在“%”之前或之后的指定字符串视为常量。如:“New%”表示所有以“New”开头的字符串,“%New”表示以“New”结尾的字符串。
· “_”规定任何单个字符可代入“_”的位置。这在只有一个字符不同的相近字符的情况下非常有用。
· “[]”规定使用方括号中定义的字符代替一个字符。方括号中可能是独立的字符(如[ahg]),也可是字符范围(如[c-i])。
· “[^]”规定方括号中“^”之后的字符为不能用来代入的字符,它可以是独立字符(如[ahg]),也可是字符范围(如[c-i])。
注意:可以在一个表达式中组合运用这些通配符。
· BETWEEN 如果操作数在提供的范围之内,则返回TRUE。
1.在要备份的数据上建立以下存储过程:
CREATE PROCEDURE [dbo].[过程名] AS
declare
@filename nvarchar(100),--文件名
@NowDay int --设置时间
set @filename='F:JXXdata' cast(Day(GetDate()) as varchar(2)) '.dat' --文件路径及文件名
Set @NowDay=Day(GetDate())
if (@NowDay>=20) or (@NowDay<=10) --这个月的20到下个月的10要备份
begin
print @filename BACKUP DATABASE [数据库名()你也可以设参数] TO DISK = @filename WITH INIT , NOUNLOAD , NAME = N'XX数据备份', NOSKIP , STATS = 10, NOFORMAT
end
存储过程要调试好无误
2、进入企业管理器中->管理->sql server代理->作业,新建作业,作业名称随便取,例如:data备份,所有者选择sa,当然你也可以选择其他用户,前提是该用户有执行作业的权限;
3.在步骤中取名-选中要备份的数据库 --在命令中输入 exec('过程名')
4.在调度中选反复出现--更改--选每天--时间自己输入
5.测试完后-最后导入脚本 进入服务器
6.把SQlServer服务管理器 启用SqlServer Agent服务


在MS SQL SERVER 安装目录下有个可执行文件叫 TEXTCOPY.EXE
可对 MS SQL SERVER 中的文本或图像数据进行输入输出.
不过你可以在MS-DOS方式下执行textcopy /? 得到它的描述。
 
下面是这个工具的描述:
Copies a single text or image value into or out of SQL Server. The val
ue
is a specified text or image 'column' of a single row (specified by th
e
"where clause") of the specified 'table'.
If the direction is IN (/I) then the data from the specified 'file' is
copied into SQL Server, replacing the existing text or image value. If
the
direction is OUT (/O) then the text or image value is copied from
SQL Server into the specified 'file', replacing any existing file.
TEXTCOPY [/S ][sqlserver]] [/U [login]] [/P ][password]]
[/D ][database]] [/T table] [/C column] [/W"where clause"]
[/F file] [{/I | /O}] [/K chunksize] [/Z] [/?]
/S sqlserver The SQL Server to connect to. If 'sqlserver' is n
ot
specified, the local SQL Server is used.
/U login The login to connect with. If 'login' is not spec
ified,
a trusted connection will be used.
/P password The password for 'login'. If 'password' is not
specified, a NULL password will be used.
/D database The database that contains the table with the tex
t or
image data. If 'database' is not specified, the d
efault
database of 'login' is used.
/T table The table that contains the text or image value.
/C column The text or image column of 'table'.
/W "where clause" A complete where clause (including the WHERE keyw
ord)
that specifies a single row of 'table'.
/F file The file name.
/I Copy text or image value into SQL Server from 'fi
安装Oracle数据库后,当我们访问8080端口时,会弹出一个XDB窗口,要求输入用户名和密码。这样将和我们本地一些使用该端口的应用冲突,比如tomcat、jboss等,虽然这些端口是可以修改的,但总是不爽oracle一直占用这个端口。以下是我找到的一个方法,我已经试验成功了,如果你想用此法进行修改,请首先备份数据库重要内容,如果操作不慎,难免要重装数据库。
Oracle数据库可以使用TCP协议通过8080端口进行连接,所以占用了8080端口。
要取消占用,可以打开Oracle安装目录下的database目录内的SPFILE[SID名].ORA文件进行修改。这个文件是Oracle的启动配置文件。
把其中的*.dispatchers='(PROTOCOL=TCP) (SERVICE=or9iXDB)'这一行去掉即可。
然后重启计算机,或者在服务中重启OracleService[SID名]这个服务。重启后可能无法使用Enterprise Manager Console和其他客户端连接,这时请使用Oracle的Configuration and Migration Tools/Net Configuration Assistant工具删除监听器,然后新建一个监听器,重启监听器。
使用Configuration and Migration Tools/Net Manager工具,将服务命名删除,然后新建一个。
现在Oracle应该就可以正常使用,8080也不会占用了。


标签:[!--infotagslink--]

您可能感兴趣的文章: