首先,我不是 DBA,我是一名软件工程师,并且一直在构建应用程序,这些应用程序在我的整个职业生涯中都是由数据库支持的。我记得的一件事(可能是错误的)是,在设计 ERD 时,您要考虑现实世界,因为它是您设计的背景。
我有一种情况,我们有一个客户的概念,他可以有两个而且只有两个电话号码。一个客户也可以有零到多个地址,并且每个地址只能有两个电话号码(以及一个指示该号码是否为手机号码的标志)。地址上的号码仅用于联系该特定地址的某人,而客户的号码则用于联系客户(其地址可能不在系统中)。
我想出的设计是将 Phone1 Phone2 作为列在客户表和地址表上。我有其他人建议这不是一个好的设计,我应该创建一个 PhoneNumber 表(我不确定他们是如何建议我将这些号码与其他记录相关联的)。
当然,我也可以看到它是有效的,但我仍然需要在客户和地址表中包含 Phone1Id 和 Phone2Id,或者在 Phone 表中有一些东西告诉我哪个记录拥有该号码。我遇到的问题当然是使应用程序逻辑更加复杂,因为我现在需要添加、删除或更新电话表中的记录,而不仅仅是将相应表中的值清空或归零。
我的设计也可以接受吗?一个还是另一个更可取?或者两者都一样有效?
我有一个带有不可为空VARCHAR(MAX)列的表,其中每一行都包含一个空字符串(第三方数据库,因此我无法更改它)。我看到了大量的空间使用,超过 15GB 的 100 万行。
如果我运行以下查询,我会看到 LOB_DATA 的大量 used_pages,即使该列中没有数据。不包括VARCHAR(MAX)行大小低于 8000 字节。
SELECT o.name AS table_name,p.index_id, au.type, au.type_desc, au.total_pages, au.used_pages, au.data_pages
FROM sys.allocation_units AS au
JOIN sys.partitions AS p ON au.container_id = p.partition_id
JOIN sys.objects AS o ON p.object_id = o.object_id
WHERE o.name = 'table
ORDER BY o.name, p.index_id;
type type_desc total_pages used_pages data_pages
1 IN_ROW_DATA 23258 23252 23188
2 LOB_DATA 1880733 1880455 0
3 ROW_OVERFLOW_DATA 0 0 0
Run Code Online (Sandbox Code Playgroud)
评论更新:
注意:我是开发人员...
我有一个资产表,其中包含许多代码,这些代码是进入第二个表 OutlineFiles 的外键。OutlineFiles 表将类型和代码作为主键。外键约束需要看起来像这样......
ALTER TABLE "dbo"."Assets"
ADD CONSTRAINT "Locations" FOREIGN KEY ( "LN", "LocationCode" ASC )
REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );
ALTER TABLE "dbo"."Assets"
ADD CONSTRAINT "CostCentre" FOREIGN KEY ( "CC", "CostCentreCode" ASC )
REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );
Run Code Online (Sandbox Code Playgroud)
因此,将通过“LN”和“CC”的固定值与轮廓表建立关系。或者将数据库更改为有两个表并删除 OutlineFiles 表上的 Type 列会更容易吗?我正在 Sybase 中尝试这个,但我们支持许多数据库。
我已经从几个地方指出这个脚本,这显然有助于在 Microsoft SQL Server 中设计索引:http : //indexanalysis.codeplex.com/
问题是我使用的是 Sybase ASA 11,它使用的 T-SQL 实现似乎与 MS 使用的略有不同。当我尝试运行脚本时出现各种错误。
我对数据库调优有足够的了解,可以告诉在哪里放置索引,仅此而已。我是一名程序员,所以我不太了解它。
我的问题是: 有没有类似于 Sybase 的这个工具的东西?我需要知道将索引放在哪里,而不必进行每个查询(如果可以避免的话)。
我们正在为一家希望能够将旅客信息输入在线数据库的旅游公司开发旅行/旅游应用程序。
在数据库中存储护照号码是否有任何安全最佳实践?应该加密吗?
我使用带有特殊字符的语言(例如:e -> é)。我有一个带有 a 的查询,LIKE但是当我搜索一个带有特殊字符的单词并且我的查询没有特殊字符时,我没有得到我期望的结果:
select * from a where name like '%e%'
Run Code Online (Sandbox Code Playgroud)
当数据库包含“dés”时,上述内容不返回任何结果。有没有办法让这个查询返回所需的结果。
我开始设计一个在 Web 解决方案中使用的数据库,并想了解将密码(以及其他用户信息)存储在一个单独的表中是否有任何好处,该表与用户 id 表.
我编写了这个函数,它应该遍历文本数组并将每个元素(这是一个类型转换的整数)转换为十六进制,附加到文本变量,然后返回十六进制。然而,我什么也得不到。
有没有人看到该函数有任何问题会导致它不返回任何内容?
CREATE OR REPLACE FUNCTION array_convert_to_hex(text[])
RETURNS text
AS
$$
DECLARE
arrInts ALIAS FOR $1;
retVal text;
BEGIN
FOR I IN array_lower(arrInts, 1)..array_upper(arrInts, 1) LOOP
retVal := retVal || lpad(cast(to_hex(arrInts[I]::integer) as varchar), 2, '0');
END LOOP;
RETURN retVal;
END;
$$
LANGUAGE plpgsql
STABLE
RETURNS NULL ON NULL INPUT;
Run Code Online (Sandbox Code Playgroud) 我正在设计一个应用程序并考虑有关数据库系统的一些选项,因为我不熟悉 Microsoft SQL Server。我想知道是否可以让 2 个服务器共享相同的文件,如下所示。

这个想法是数据在一个突袭系统中,所以它会给我们一些安全。这样我们就可以节省同步两个数据库的工作量并节省一些存储费用。我们一次只需要一个数据库,第二个只是为了在第一个失败的情况下使用。
这可能吗?
我对不同的方法持开放态度。主要问题是数据库冗余,我们的应用程序必须保证这一点。
目前我使用的是 Windows 7 和 SQL Server 2008R2。
数据库没有响应简单的选择语句,如
select * from table
Run Code Online (Sandbox Code Playgroud)
我注意到sys.dm_os_waiting_tasks一个会话被阻塞,阻塞会话指向一个使用 lock & Tran 的存储过程,如下所示
BEGIN TRAN
declare @min numeric ,@com numeric
select top 1 @com=companyid from tblcompanies
order by newid()
select @min=min(productid) from tblproducts(UPDLOCK)
where companyid=@com and (lockstatus<>1 or lockstatus is null )
update tblproducts
set lockStatus='1'
where productid>=@min and productid<@min+4
select distinct top 4 s.productname,s.productid,s.companyid,r.Type,r.requestType,r.UserID
from tblcompanydetail rd inner join tblproducts s
on rd.productid=s.productid
inner join tblcompanies r
on r.companyid=s.companyid
where s.productid>=@min and s.productid<@min+4
if @@error >0 rollback tran
commit tran …Run Code Online (Sandbox Code Playgroud) sql-server ×2
sybase ×2
disk-space ×1
encryption ×1
foreign-key ×1
functions ×1
index ×1
ms-access ×1
odbc ×1
postgresql ×1
query ×1
replication ×1
storage ×1