我正在构建一个跟踪计算机设备和其他硬件设备的库存数据库。在任何设备生命周期的某个时刻,它都会退役并被归档。归档后,需要对其进行跟踪,因为它已从服务中移除并妥善处置。我最初使用活动数据库的精确副本设计了归档机制,该副本将使用从活动数据库中删除时的触发器接收其数据。存档数据库包括所有相关表的副本,因为由于某些外来相关记录不再相关,因此用户不应访问它们以用于新设备,但需要使用存档表进行引用完整性和查询。请记住,此处存档的概念不仅仅是保存历史记录或日志。归档是业务流程的一部分,
下面的 ERD 使用该Inventory.DeviceType表作为示例,其中所有条目和更新都复制到该Archive.DeviceType表中。当用户不再能够输入某种设备类型的库存记录时,它会从Inventory.DeviceType表中删除,但保留在存档表中。此模式用于所有表以确保存档引用有效数据,因此是所有表的副本。
活动表示例(省略其他相关表)

归档表示例(省略其他相关表)

问题
我想弄清楚如果我不知道设备是活动的还是存档的,我将如何查询数据库?例如,如果用户有一个序列号并想查找有关设备的信息,而他们不知道它是否已存档。
选项 1:基于联合创建一个视图?
选项 2:如果第一个查询没有返回任何内容,则查询活动数据库,然后查询存档?
传奇还在继续……
一位同事建议我删除存档数据库并使用软删除方案。我使用这个想法构建了一个模型,然后开始遇到许多其他问题。
以下是使用软删除方案的相同表。
软删除示例

使用此设置,通过将IsArchivedfield设置为 true 并输入ArchivedDate. 我可以轻松查询任何设备是否处于活动状态或已存档。(请忽略该IsActive字段,因为它用于不相关的概念)。
请注意电话子类型表,我必须在其中传播 DeviceID 和 IsArchived 标志的索引,因为活动设备的电话号码必须是唯一的。我也必须对其他子类型表执行此操作。我不知道这是一个好还是坏的设计。
这部分真的让我很困惑......
在外键值可以标记为已删除的情况下,处理软删除的最佳做法是什么。我唯一能想到的就是创建一个例程来搜索与已删除数据相关的所有记录,并为用户创建一个报告来解决差异。例如,如果位置表与设备表相关,并且某些位置被软删除,则设备指的是不再存在且必须移动的位置。
顺便说一下,我使用的是 MS SQL Server 2008 R2,我计划在我的应用程序中使用 Entity Framework 4。我更看重数据库的可维护性而不是性能。
感谢您的阅读。
假设我有以下查询:
SELECT *
FROM AppDetails, AppTags
WHERE AppDetails.AppID = '1'
AND AppDetails.AppID = AppTags.AppID
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
AppID AppName AppType Tag
1 Application1 Utility Test1
1 Application1 Utility Test2
1 Application1 Utility Test3
Run Code Online (Sandbox Code Playgroud)
如何修改查询以返回如下内容:
AppID AppName AppType Tags
1 Application1 Utility Test1,Test2,Test3
Run Code Online (Sandbox Code Playgroud) 这是我的查询
select *
from players
where sport='football'
and position='DEF'
and pname!='Binoy Dalal'
and pname not in (select player1,player2,player3,player4,player5,player6,player7,player8
from team
where sap='60003100009')
order by price desc;
Run Code Online (Sandbox Code Playgroud)
没有该pname not in ...条款它工作正常。
我无法弄清楚什么是错误的原因在语法上它是正确的,因为 mysql 没有显示任何错误。
谁能建议我如何检查具有相同数据的多行?
例如
我有 2 行具有以下值:
Cola Colb Colc
TYPE_APPLE 123 abc
Colb Colb Colc
TYPE_APPLE 123 abc
Run Code Online (Sandbox Code Playgroud)
我想编写一个 SQL 查询,它不会选择包含与上述相同数据的多行数据。我应该如何编写查询?
我有这个查询来构建我的 drop login 语句。作为第二部分,我想执行这个输出。理想情况下,我想通过两个步骤(生成和执行)在 sql 作业中执行此操作。这能做到吗?
SELECT 'DROP LOGIN [' + name + ']'
FROM [master].[dbo].[syslogins]
WHERE isntgroup = 0
AND isntuser = 0
AND sysadmin = 0
AND name != 'sa'
AND name NOT LIKE '##%'
ORDER BY name
Run Code Online (Sandbox Code Playgroud) 我有两个查询查询 1:
SELECT
e.eid, e.item as 'ITEM', SUM(s.qty) as 'TOTAL SOLD'
from
tbl_sales s,
tbl_matentry e
WHERE
e.eid = s.item
GROUP By e.eid ;
Run Code Online (Sandbox Code Playgroud)
结果 1:
+---------+-------------+---------------+
| eid | ITEM | TOTAL SOLD |
+---------+-------------+---------------+
| 1 | rupa | 5 |
| 2 | pan america | 3 |
| 3 | John Player | 10 |
| 4 | classmate | 11 |
| 5 | lepakshi | 55 |
| 6 | lee | 14 | …Run Code Online (Sandbox Code Playgroud) 我们将用户关联到具有有限权限的模式。在运行期间,我们使用相同的用户登录生成对称密钥。由于用户具有有限的权限,我们现在无法创建密钥。
如何授予此用户在 sql server 2008 中创建、读取和执行对称密钥的权限?
我有大约 60,000 行需要将信息从 column_a 更新到 column_b。例如,60,000 名客户需要他们的到达时间来匹配他们的离开时间。我知道我可以用一行来做到这一点,它可以在更新语句中使用嵌套的 select 语句。当我尝试更新多行时,我相信我必须拥有 60,000 个唯一的密钥标识符。
这是我用来更新 1 条记录的方法,我使用的是 Oracle SQL:
UPDATE patient
SET discharge_dt = (SELECT admit_dt
FROM patient
WHERE pat_seq = 'XXXXXX')
WHERE facility_id = 'X'
AND pat_seq = 'XXXXXX'
Run Code Online (Sandbox Code Playgroud)
为令人困惑的描述道歉,我本人并不是真正的数据库管理员。
对此的任何帮助将不胜感激。
我有 2 种不同的方式来查询在执行时表现出性能差异的内容。第一种方法是
EXPLAIN select SOME_COLUMNS
from
( select *
from A
where CONDITION
) p
inner join
( select *
from B
)st
on p.id = st.id;
Run Code Online (Sandbox Code Playgroud)
此查询的输出返回:
"id" "select_type" "table" "type" "possible_keys" "key" "key_len" "ref" "rows" "Extra"
1 PRIMARY derived3 ALL NULL NULL NULL NULL 25607 " "
1 PRIMARY derived2 ALL NULL NULL NULL NULL 21037 Using where; Using join buffer
3 DERIVED A ALL NULL NULL NULL NULL 23202 " "
2 DERIVED B ref IDX_A_TYPE_ID …Run Code Online (Sandbox Code Playgroud) 我担心我恢复的数据库与原始数据库有很大不同:
#check size of postgres database
postgres@db1:/tmp$ psql -c "select pg_size_pretty(pg_database_size('test_db'));"
pg_size_pretty
----------------
2105 MB
(1 row)
#backup database
postgres@db1:/tmp$ pg_dump -Fc test_db > test_db_Fc.dump
#rename postgres database (i.e. park it nearby)
postgres@db1:/tmp$ psql -c "alter database test_db rename to test_db_20130322;"
ALTER DATABASE
-------
(1 row)
#restore test_db
postgres@db1:/tmp$ pg_restore -Fc -C -d postgres test_db_Fc.dump
#check size of restored postgres database
postgres@db1:/tmp$ psql -c "select pg_size_pretty(pg_database_size('test_db'));"
pg_size_pretty
----------------
257 MB
(1 row)
Run Code Online (Sandbox Code Playgroud)
原始数据库比恢复的数据库大很多倍。这里发生了什么?据我所知,test_db 服务的网站在恢复后仍然运行良好,但在实时上下文中使用备份之前,我需要知道发生了什么。
仅供参考,如果我在每个数据库上运行vacuumdb,数据库大小似乎没有变化。
[附录,稍后添加] 在 RTFM 的传统中,我已经在 PostgreSQL …
mysql ×3
sql-server ×3
join ×2
encryption ×1
explain ×1
oracle ×1
postgresql ×1
syntax ×1
update ×1