Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

能否支持外键检查 #8

Closed
lkm1107 opened this issue Mar 3, 2017 · 7 comments
Closed

能否支持外键检查 #8

lkm1107 opened this issue Mar 3, 2017 · 7 comments

Comments

@lkm1107
Copy link

lkm1107 commented Mar 3, 2017

很好的工具, 谢谢, @davyxu

实际开发过程中, 经常会遇到策划数据删数据或者改ID导致逻辑异常, 如果能支持判断外键对应的ID是否存在, 能省掉不少麻烦
如:
Sample.xlsx

ID ItemID BuffID
int32 int32 repeated int32
RepeatCheck:true MustFill: true ForeignKey:"Item.ID" ForeignKey:"Buff.ID"

Item.xlsx

ID Name
int32 string
RepeatCheck:true

则会验证Sample中的ItemID,BuffID字段是否包括错误的关联ID

@davyxu
Copy link
Owner

davyxu commented Mar 3, 2017

你好, 我们项目也碰到这个问题, 正在考虑如何完整实现这种需求

你可以将你们的需求再多提供一些, 这样可以方便我总结实现

@lkm1107
Copy link
Author

lkm1107 commented Mar 3, 2017

结合之前项目的需求, 也再和我们策划谈论了下, 数值策划在配置的时候,往往会有如下问题

  1. 简单的验证,如已经实现的RepeatCheck、MustFill等, 如简单的数值范围判断(血量在0-1000,掉落权重在0-10000),复杂可以考虑用正则支持?
  2. 跨表的外键检查(也就是主贴中的需求), 物品ID之类往往需要配置在其他表(合成表,掉落表)中, 但是如果是配置了不存在的物品ID又会造成逻辑错误, 所以这边需要有这个需求ForeignKey:"Item.ID"来配置关联
ID ItemID BuffID
int32 int32 repeated int32
RepeatCheck:true MustFill: true ForeignKey:"Item.ID" ForeignKey:"Buff.ID"
1 11 22
  1. 还有一种更复杂的需求,不过感觉没必要在表格中引入这层关联, 这边也举个例子: 战斗系统中, 往往会有很多的技能效果(固定数值回血、按体力上限比例回血,回血buff等等),每种效果当作一个独立的类型, 则每个效果都会有不定项的参数约定:
ID name params
int32 string repeated string
1 固定数值回血 1000
2 按体力上限比例回血 20%
3 回血buff 3;10%(持续3回合,每回合10%)
4 回血buff 4;20%(持续4回合,每回合20%)

这样在配置表的时候, 往往还需要有个效果对应参数的文档来配置,很容易漏掉某个参数,或者应用错参数格式

@davyxu
Copy link
Owner

davyxu commented Mar 3, 2017

兄弟, 你跟我想的差不多, 特别是外键这个概念, 非常正规

以下是我对这个功能的设想:
@types表单一样, 这个功能也会使用嵌入的独立表单实现, 叫@verify
大概这样验证:

规则名 条件 字段 条件值
圆形攻击范围匹配 单元格值存在 Skill.AreaType 圆形
圆形攻击范围匹配 单元格值存在 Skill.AreaParam.Radius
圆形攻击范围匹配 单元格值范围约束 Skill.AreaParam.Radius 0<value<10
直线攻击范围匹配 单元格值存在 Skill.AreaType.Line
直线攻击范围匹配 单元格值存在 Skill.AreaParam.Width
直线攻击范围匹配 单元格值存在 Skill.AreaParam.Height
角色限定攻击范围 单元格值等于 Actor.Type 战士
角色限定攻击范围 枚举约束 Skill.AreaType 圆形

逻辑:

  • 规则名相同的视为一组规则
  • 同组规则内, 通过选定不同条件与目标单元格进行匹配检查
  • 同组匹配关系从上到下
  • 同组每一行规则关系为与关系, 就是必须都满足

看看是否能通用你的需求

@lkm1107
Copy link
Author

lkm1107 commented Mar 3, 2017

@davyxu 需求上是能满足的, 这样做相当于是实现了多层的验证。
不过如果是对某个字段的简单的规则验证, 是不是放Meta中会更好? 策划在配置的时候也能看到这层约束, 而不需要再去另外的表单中对照? 当然,如果是自定义类型的验证是需要放@type或者独立的@Verify中

@davyxu
Copy link
Owner

davyxu commented Mar 3, 2017

其实我也希望这样, 但是几个字段的验证, 你写哪个字段呢?
我会给字段加上独立于验证系统的范围验证, 类似于MustFill这种, 简单验证用这个就可以
复杂验证, 再使用这个表就可以

@lkm1107
Copy link
Author

lkm1107 commented Mar 3, 2017

嗯, 的确, 目前来说常用的也就针对单字段的简单验证(MustFilll,Range[1,100]。。)以及ForeignKey,复杂验证需求相对低, 引入@verify也蛮好的。

@davyxu
Copy link
Owner

davyxu commented May 11, 2017

这个功能我们已经在项目中改为使用golang代码来实现
我们在项目中有一个table包, 里面有tabtoy输出的代码和一些手动检查表格正确性和构建静态数据的代码
在导表时, 运行一个独立的go文件编译table包来读取导出的json文件并检查内容

这样做灵活度比在导表工具内高很多, 也无需学习. 而且与项目整合的也很好

建议使用这种方法替代新功能制作

@davyxu davyxu closed this as completed Jun 15, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants