我很难为我的数据库表在自然 PK 和代理 PK 之间进行选择。
该数据库用于 MOBA 游戏的排名系统。如果我走自然路线,这或多或少是我会做的。
玩家表
- PlayerID Int AI NN UQ
- PlayerName Varchar PK
- ServerName Varchar PK
- Registered date, level, hero etc misc columns
Run Code Online (Sandbox Code Playgroud)
排名表
- PlayerName FK references player
- ServerName FK references player
- RankID Int AI NN UQ
- PlayerRank Int NN UQ
Run Code Online (Sandbox Code Playgroud)
问题是,玩家表中的每一行都由一对 PlayerName 和 ServerName 唯一标识。我认为在这种情况下使用代理键并不是很合适,但我想听听关于此的建议。
每条记录重 52 字节,如果有人拥有所需的存储空间,在今天的技术中是否可能?什么样的数据库可以保存数据并可以检索它。
一个示例记录:
(5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAbuatmU
,1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a
,1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9)
Run Code Online (Sandbox Code Playgroud)
记录数为 115792089237316195423570985008687907853269984665640564039457584007913129639936
对于我的系统,学生需要通过填写注册表(个人、联系方式和课程详细信息;还有用户名和密码)来创建一个用户帐户。
我需要通过一个表单收集注册数据,并将收集到的数据插入到我数据库中的两个相关表中(student表中的所有学生详细信息和users)。
我如何最好地在 php 中编码?

好吧,基本上我觉得我倾向于过度规范化事情,也许我这样做是以牺牲性能为代价的。因此,为了阐明这个问题,我创建了以下模式作为示例:

如您所见,我概述了两种不同的方法。这里的想法是所有大学都有课程(例如工程),并且所有课程都有专业(例如电气工程)。为了让这个例子起作用,我们必须假设有 40 个项目,比如 1000 个专业,并且学校有相同的项目/专业。
现在,我在这种情况下的典型做法是将任何可能重复的内容(即专业和课程)放入自己的表中;然后有一个关系,如上所示。另一种我倾向于远离的方法是第二种模型,其中 program 和 major 是具有重复值的列(例如,Engineering 可能会在表格中重复 1,00 次)。基本上,如果值重复,我会为它创建一个表。
现在,我对其中哪一种更好的方法不太感兴趣,因为我只是用它们作为一个例子来阐明真正的问题:人们如何知道它们何时过度规范化?我知道您在规范化表格方面做得太过分了,但我从来不知道衡量标准是什么。
附录
大学不需要在一个项目中拥有所有专业,因此大学与专业相关,而不是项目(例如,大学 X 有工程学院,但没有核工程,这是工程项目的一部分)。
我目前正在构建一个包含许多用户、两个角色和两个组的应用程序。从逻辑上讲,我们希望用户能够成为两个组内其他用户的管理员。
用户表
UserID varchar PK
DisplayName
Email
Role int FK `role`.`RoleID`
DATA [jschmo,Joe Schmo,joe@schmo.com,1]
Run Code Online (Sandbox Code Playgroud)
角色表
RoleID int PK AI
RoleName varchar
DATA [1=Master,2=Admin,3=User]
Run Code Online (Sandbox Code Playgroud)
组表
GroupID int PK AI
GroupName
DATA [1=Marketing,2=Infrastructure]
Run Code Online (Sandbox Code Playgroud)
用户可能是两个组的管理员。我没有看到多选外键的选项,但据我了解,在列中使用逗号分隔的列表是一个坏主意,我应该使用多条记录,但我不喜欢拥有多条记录的想法对于每个用户。
问:我如何跟踪用户是哪些组的管理员?
我需要创建一个如下所示的表:
+----+---------+---------+
| Id | Product | Version |
+----+---------+---------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 3 |
| 5 | 2 | 2 |
+----+---------+---------+
Run Code Online (Sandbox Code Playgroud)
哪里ID是Identity(1,1)我需要的Version是自动填充这取决于插入Product。
SELECT使用ROW_NUMBER()with可以达到类似的效果PARTITION:
SELECT ID, Product,
ROW_NUMBER() OVER(PARTITION BY Product ORDER BY ID) AS Version
FROM Products
Run Code Online (Sandbox Code Playgroud)
我有哪些选择?
假设我有一张ORDERS_LINE桌子和一张PRODUCT桌子,ORDERS_LINE桌子上必须包含订购了哪种产品的信息。我更喜欢使用基于名称的主键,因为它在另一个表中更容易阅读,并且减少了重复项目的机会。但这是我的意见,我真的不知道是否有标准,或者一种方法是否比另一种更有效。
我有一个 Datawarehouse 星型架构。一张 Dim 表是“DimTweet”。这包含推文详细信息。
对于选定的日期,我希望能够显示推文的数量。
但是,我目前的设计有问题。对于 DimTweet tbl 中的多行,如何在 Fact tbl 中使用一个 TweetID 作为 FK?
代码:
INSERT INTO [CarDW].[dbo].[FactCarDetail]
([CarID]
,[RegionID]
,[DateID]
,[TweetID]
,[SharePrice]
,[ShareQty]
,[SalesQty]
,[TweetCountPositive]
,[TweetCountNegative])
SELECT
c.CarID,
r.RegionID,
d.DateKey,
-- ????? AS TweetID
scsp.Price,
scsp.Quantity,
scs.Quantity,
-- COUNT NO. OF TWEETS Postive
-- COUNT NO. OF TWEETS Negative
FROM
dbo.DimCar c
INNER JOIN
dbo.StagingCarSale scs
ON scs.CarModel = c.Model
INNER JOIN
dbo.DimRegion r
ON r.Region = scs.Region
INNER JOIN
dbo.DimDate d
ON d.Date = scs.SaleDate
--INNER …Run Code Online (Sandbox Code Playgroud) 我见过命名为描述性文本字段DESCRIPTION,REMARK和NOTE。他们似乎是同一个意思。那么什么比其他的更合适呢?
我正在设计一个基于 NBA 统计网站 ( http://stats.nba.com/player/#!/201939/?p=stephen-curry ) 的数据库
如果您转到发布在球员统计数据上的链接,您会注意到球员的统计数据是根据不同因素(例如季节、月份、位置、主场或客场等)进行组织的,您可以根据过滤器进行设置环境。
问题是,设计站点数据库的人如何允许有效查询每个玩家的统计数据。每个玩家都会有一系列的游戏日志,这些日志会记录他们每个季度的统计数据。
他们是否使用物化视图来计算月度和季节性统计数据以进行高效查询?
我尝试设计以下数据库:
database-design ×10
mysql ×2
ddl ×1
facttable ×1
identity ×1
php ×1
primary-key ×1
role ×1
sql-server ×1
star-schema ×1
storage ×1
t-sql ×1
users ×1