Jam*_*mie 12 sql database-design rdms
考虑下面的数据结构,其中用户具有少量固定设置.
[Id] INT IDENTITY NOT NULL,
[Name] NVARCHAR(MAX) NOT NULL,
[Email] VNARCHAR(2034) NOT NULL
Run Code Online (Sandbox Code Playgroud)
[SettingA],
[SettingB],
[SettingC]
Run Code Online (Sandbox Code Playgroud)
将用户的设置移动到单独的表中是否正确,从而与users表创建一对一的关系?这是否比将用户存储在与用户相同的行中提供了任何真正的优势(明显的缺点是性能).
当表变得非常宽(即有很多列)时,通常会将表拆分为两个或多个1:1相关表.程序员很难处理包含太多列的表.对于大公司来说,这样的表可以轻松拥有超过100列.
想象一下产品表.有一个售价和另一个价格,仅用于计算和估算.拥有两个表,一个用于真实值,一个用于规划阶段,这不是一件好事吗?所以程序员永远不会混淆这两个价格.或者采取产品的逻辑设置.您想要插入到products表中,但是在其中包含所有这些逻辑属性,您是否需要设置其中的一些?如果是两个表,则会插入到产品表中,另一个负责物流数据的程序员会关心后勤表.没有更多的困惑.
许多列表的另一个问题是,对于具有150列的表而言,全表扫描当然比仅具有一半或更少的表的表更慢.
最后一点是访问权限.使用单独的表,您可以在产品的主表和产品的逻辑表上授予不同的权限.
总而言之,看到1:1关系是很少见的,但它们可以更清晰地了解数据,甚至可以帮助解决性能问题和数据访问.
编辑:我正在接受Mike Sherrill的建议,并(希望)澄清关于规范化的事情.
规范化主要是关于避免冗余和相关性缺乏一致性.是否仅在一个表或更多1:1相关表中保存数据的决定与此无关.您可以决定在一个表中拆分用户表,以获取个人信息,如姓名和他的学校,毕业和工作.两个表都将保持原始表格的正常形式,因为没有比以前更多或更少冗余的数据.使用两次的唯一列是用户ID,但这不是多余的,因为在两个表中都需要它来标识记录.
因此询问"将设置标准化为单独的表是否正确?" 这不是一个有效的问题,因为你没有通过将数据放入1:1相关的单独表来规范化任何事情.
你们都错了:)只是开玩笑。
在高负载、高容量、频繁更新的系统上,按 1:1 拆分表有助于优化 I/O。
例如,通过这种方式,您可以将大量读取的列放置到单独的物理硬盘驱动器上,以加速并行读取(为此,1-1 表必须位于不同的“文件组”中)。或者您可以优化表级锁。等等等等。
但这种类型的优化通常不会发生,除非你有数百万行和巨大的读/写并发
| 归档时间: |
|
| 查看次数: |
6590 次 |
| 最近记录: |