【问题标题】:SQL table and attribute designSQL表和属性设计
【发布时间】:2015-07-01 08:11:10
【问题描述】:

关系:一个事务可以有多个 Trans_Detail

Trans_Detail 用于保存交易的详细信息,
比如客人从酒店带走的物品和价格

Trans_Detail 用于记录交易明细,
Trans_Detail.Trans_ID 也是 PK 也是 FK,
数据库可以这样设计吗?
或者有什么更好的建议?

【问题讨论】:

  • 可以这样设计吗-可以。考虑到这种详细程度,我们不知道它是否适合您的使用!
  • Trans_ID as varchar(10) 和 Primary key / Foreign Key 不是一个好主意。我会在事务表中创建一个列ID BIGINT INDENTITY(1,1)。然后是 ID 上的唯一聚集索引,Trans_ID 上的唯一非聚集索引。将 Trans_Detail 中的 Trans_ID 更改为 BIGINT 并将其引用到 Transaction.ID .....
  • 视情况而定。这取决于您要实现的目标、您想要存储的内容、您的业务问题、您的存储容量、您认为表访问的“热”程度、这是否是用于报告的表。 ......这么多的问题,但这么稀疏的问题。请提供有关您的方案的更多信息。
  • 这是酒店系统数据库的一部分,我老师说这部分不是很好的数据库设计,说不能这样,因为Trans_Detail.Trans_ID设置为PK和FK,但他不能告诉我们为什么不能这样,也不能给我们建议!!

标签: sql sql-server


【解决方案1】:

主键必须是唯一的。如果 trans_detail 对于给定的事务 ID 可以有很多行,则该事务 ID 不能是唯一的。

看起来 trans_detail 包含构成交易的行,并且交易更像是订单。

如果是这种情况,您可能需要将 trans_detail 重命名为“trans_line”。主键可以是人工键(自动递增数字或其他东西),或者如果订单行的序列很重要,您可以将其作为字段包含在 trans_line 中,并在 trans_id 和序列之间创建复合主键。

我不太喜欢在表名和列名中使用缩写词 - 额外的输入值得清晰......

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多