Questions tagged «database-design»

数据库的概念模式和/或逻辑模型和/或物理设置的开发。


2
默认约束,值得吗?
我通常按​​照以下规则设计数据库: 除db_owner和sysadmin外,其他任何人都不能访问数据库表。 用户角色在应用程序层进行控制。我通常使用一个db角色来授予对视图,存储过程和函数的访问权限,但是在某些情况下,我添加了第二条规则来保护某些存储过程。 我使用TRIGGERS最初验证关键信息。 CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DML使用存储过程执行: sp_MyTable_Insert(@Field1, @Field2, @Field3, ...); sp_MyTable_Delete(@Key1, @Key2, ...); sp_MyTable_Update(@Key1, @Key2, …


6
始终将单个整数列作为主键的不利之处是什么?
在我正在处理的一个Web应用程序中,所有的数据库操作都使用在Entity Framework ORM上定义的一些通用存储库来抽象。 但是,为了对通用存储库进行简单设计,所有涉及的表都必须定义一个唯一的整数(Int32在C#中,int在SQL中)。到目前为止,这始终是表格的PK以及IDENTITY。 外键被大量使用,它们引用这些整数列。它们是一致性和ORM生成导航属性所必需的。 应用程序层通常执行以下操作: 从表(*)加载初始数据 -SELECT * FROM table 更新 -UPDATE table SET Col1 = Val1 WHERE Id = IdVal 删除 -DELETE FROM table WHERE Id = IdVal 插入 -INSERT INTO table (cols) VALUES (...) 不太频繁的操作: 批量插入 - BULK INSERT ... into table所有数据加载后跟(*)(以检索生成的标识符) 批量删除 -这是正常的删除操作,但是从ORM的角度来看,这是“笨拙的”:DELETE FROM table where …

6
存储DateTime的首选方式
我们可以通过两种方式存储日期和时间信息。存储DateTime信息的最佳方法是什么? 使用DateTime将日期和时间存储在2个单独的列中还是1个列中? 您能解释一下为什么这种方法更好吗? (链接到MySQL文档以供参考,该问题是一般性的,不特定于MySQL) 日期和时间类型:日期和时间

8
为什么主键值会改变?
我最近一直在研究ROWGUID的概念,并遇到了这个问题。 这个答案给出了真知灼见,但由于提到更改主键值,使我陷入了另一个困境。 我一直认为主键应该是不变的,而且自阅读此答案以来,我的搜索仅提供了与最佳实践相同的答案。 创建记录后,在什么情况下需要更改主键值?


2
通过第三个数据库使用同一登录名连接两个数据库是否更安全?
我们有以下设置: 包含私有数据的多生产数据库,桌面软件使用该数据库 公共网站的Web数据库,需要来自私有数据库的一些数据 一个中间数据库,其中包含一些视图和存储过程,这些视图和存储过程从私有数据库中提取数据 当前,网站登录到Web数据库,并且Web数据库连接到中间数据库以提取数据或在生产数据库上执行存储过程。所有数据库都在同一SQL实例上,并且整个过程使用相同的用户帐户。 该用户帐户具有对Web数据库和中间数据库的完全访问权限,但只能访问和私有数据库的特定视图和存储过程 这真的比仅使公共数据库直接连接到私有数据库更安全吗? 似乎中间数据库只是使事情复杂化,因为使用同一登录名来访问所有数据库中的数据,并且它已经仅限于专用数据库中所需的视图/ SP。我希望将其删除。

2
为什么我不能使用NEWSEQUENTIALID()作为列的默认值?
我试图在Management Studio中创建一个表,并在阅读了有关新功能(从SQL 2005开始)后NEWSEQUENTIALID(),以为我会尝试一下。 这就是我在做什么: 但这不是让我。我收到的错误消息是: 'FormTemplate (Forms)' table - Error validating the default for column 'FormTemplateId'. 我在这里错过了一个把戏吗?我肯定在运行SQL Server 2008 R2。

7
什么是存储大量列的好方法?
我在决定如何将这些数据存储在数据库中时遇到问题。关于最佳方法的任何建议吗?我可能对数据库一无所知。 我的数据格式如下,但不是4,列数约为240,因此每个日期都有240个与之关联的唯一值: Date/Time 200,00 202,50 205,00 2010.11.12 13:34:00 45,8214 43,8512 41,5369 2010.11.12 13:35:00 461,9364 454,2612 435,5222 此外,行与DataSite关联。 我的第一个想法是要有一个像这样的表:DataID(pk),DataSiteID,ParameterID,Date,Value,以及在DataSite,Parameter和Date上的索引。ParameterID引用另一个存储输入列标题的表(200,00 202,50 205,00 ...)。 我的第二个想法只是简单地拥有一个包含所有240多个列的表。我想出了其他几种方法,但是它们也很不令人满意。 我的第一个解决方案有一个问题(不是一个很大的问题,但我不喜欢它),因为该输入行中的所有240个值都将重复使用Date和DataSiteID,所以使用了很多时间多余的空间。 每年大约会有40gb的数据传入(采用上述文本格式),并且将通过DataSite,Parameter和Date搜索数据。传入的数据量很可能在一年左右的时间内翻两番。 有什么好主意吗?谢谢,詹姆斯 编辑:这是时间序列数据,列是在不同波长下的测量值。想要在相对窄的波长范围内分析数据。将来某个时候可能还会添加额外的波长。 编辑:谢谢你们的回答,我真的很感激:)我想我可能可以找到时间用500GB左右的测试数据进行一些实验。我会把任何结论寄回去;)

4
最好的设计从单个列引用多个表?
拟议方案 首先,这是我提议的架构示例,供我在整个帖子中参考: Clothes ---------- ClothesID (PK) INT NOT NULL Name VARCHAR(50) NOT NULL Color VARCHAR(50) NOT NULL Price DECIMAL(5,2) NOT NULL BrandID INT NOT NULL ... Brand_1 -------- ClothesID (FK/PK) int NOT NULL ViewingUrl VARCHAR(50) NOT NULL SomeOtherBrand1SpecificAttr VARCHAR(50) NOT NULL Brand_2 -------- ClothesID (FK/PK) int NOT NULL PhotoUrl VARCHAR(50) …

4
数据库设计:如何处理“归档”问题?
我敢肯定,很多应用程序,关键应用程序,银行等等每天都在执行此操作。 所有这些背后的想法是: 所有行都必须有一个历史记录 所有链接必须保持连贯 发出获取“当前”列的请求应该很容易 购买过时物品的客户仍应查看购买的物品,即使该产品不再属于目录 等等。 这是我想要做的,我将解释我面临的问题。 我所有的表都有这些列: id id_origin date of creation start date of validity start end of validity 以下是CRUD操作的想法: create =用id_origin= id,date of creation= now,start date of validity= now,end date of validity= null 插入新行(=表示它是当前活动记录) 更新= 读取=读取所有记录,其中end date of validity== null end date of validity用end date of …

2
有效的mysql表/索引设计,可处理3500万行以上的表,并具有200+相应的列(双精度),可以查询其任意组合
我正在针对以下情况寻求有关表/索引设计的建议: 我有一个大表(股价历史数据,InnoDB,3500万行,并且还在不断增长),它具有复合主键(资产(整数),日期(日期))。除了定价信息外,我还有200个双精度值需要与每个记录相对应。 CREATE TABLE `mytable` ( `assetid` int(11) NOT NULL, `date` date NOT NULL, `close` double NOT NULL, `f1` double DEFAULT NULL, `f2` double DEFAULT NULL, `f3` double DEFAULT NULL, `f4` double DEFAULT NULL, ... skip a few … `f200` double DEFAULT NULL, PRIMARY KEY (`assetid`, `date`)) ENGINE=`InnoDB` DEFAULT CHARACTER …

4
SQL大表设计
我对SQL Server 2008表设计有一个一般性问题。我们目前有一张桌子,容量超过600GB,每天增长约3GB。该表具有适当的索引,但由于其大小而在运行查询时正成为主要的挂断。问题是我应该按年和月将表拆分为多个表(这将适合其他部门如何拆分其大数据集),还是应该利用SQL Server内置的分区。看来使用分区将需要较少的代码更改。从我在分区时读取的内容来看,您仍然仅查询一张表,服务器处理如何获取数据。如果我们使用多表路由,则必须处理从多个表中提取数据。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.