数据库表设计

时间:2010-09-09 13:27:35

标签: database-design

我为系统设计如下表格 它看起来像一个包裹递送系统。

例如,用户收到包裹后,邮递员应在系统中记录,
并且状态(历史表)是“交付”的,操作员是这个邮递员,
当前状态(状态表)当然是“已交付”

history table:
+---------------+--------------------------+
|   Field       |        Desc              |
+---------------+--------------------------+
|    id         |    PRIMARY KEY           |
+---------------+--------------------------+
|    package_id |    package_tacking_id    |
+---------------+--------------------------+
|    state      |     package_state        |  
+---------------+--------------------------+      
|    operators  |    operators             |
+---------------+--------------------------+
|    create_time|    create_time           |
+---------------+--------------------------+   

state table:
+---------------+--------------------------+
|   Field       |        Desc              |
+---------------+--------------------------+
|    id         |    PRIMARY KEY           |
+---------------+--------------------------+ 
|   package_id  |    package_tacking_id    |
+---------------+--------------------------+
|    state      |    latest_package_state  |
+---------------+--------------------------+  

以上只是记录的基本信息,其他一些信息(
像发票,目的地......)也应该被记录下来 但是有不同的服务类型,如s1和s2,对于s1,它不需要 记录发票但s1需要,也许s1需要一些其他信息来记录
(像最终用户的电话)。

毕竟,在提供方式站时,还有其他信息要记录,
对于不同的服务类型,信息类型是不同的。

我的问题:

  1. 对于不同的服务类型,我是否需要声明不同的表格(选项A)或只需要 一个大表可以记录所有类型的所有信息(选项B)?
  2. 如果选项A,由于上面的基本信息是必须的,如何选择 可以防止在不同的表中声明重复的字段?

1 个答案:

答案 0 :(得分:0)

我的问题没有完整答案,但您可以在表格设计中尝试继承模式

Service Table(service) : used to put common or not-null columns in all kinds of services.
sv_id - internal key(PK)
sv_data_1, sv_data_2, ...
Service 1 Table : dedicated attributes to service 1 and 'inherited from service'.
sv1_id - internal key(PK) and foreign key to service(sv_id)
sv1_data_1, sv1_data_2, ...

等等其他专用服务表...

  1. 为了方便(和性能),如果需要列出所有类型的服务,请添加'sv_type'列来表示servcie的确切'子类型表'。
  2. 否则,只需使用“内部联接”即可获得特定类型的服务。
  3. 虽然我们需要使用“join”来获取特定类型服务的所有属性,但显示的架构会为您的问题构建“无空”解决方案。

    如果您关心性能问题,那么有一件好事:使用两个主键来连接特定类型服务的表。

    有关性能的更多信息,您可以在需要更快速查询时创建具有联接基表的缓存表,而不必担心服务的空错误和类型错误问题。