Database 指示在数据库表中具有特殊处理的值的最佳方法是什么? 设置。

Database 指示在数据库表中具有特殊处理的值的最佳方法是什么? 设置。,database,Database,我有一个表,其中存储了一个游戏的物理项目列表。项目还具有类别的分层列表。示例基表: 项目 该系统目前运行在PHP和SQLite上,但数据库后端非常灵活,可能使用MySQL,前端可能最终使用javascript或Object-C/Swift 这个问题。 在上面的示例中,程序必须对每个顶级类别及其下面的项目进行不同的特殊处理。e、 武器和坐骑由不同的商人出售,可以携带武器,但坐骑不能 在代码中标记顶级层以进行特殊处理的最佳方法是什么 虽然顶层类别相对固定,但我希望将它们保留在DB中,这样使用单个(

我有一个表,其中存储了一个游戏的物理项目列表。项目还具有类别的分层列表。示例基表:

项目

该系统目前运行在PHP和SQLite上,但数据库后端非常灵活,可能使用MySQL,前端可能最终使用javascript或Object-C/Swift

这个问题。 在上面的示例中,程序必须对每个顶级类别及其下面的项目进行不同的特殊处理。e、 武器和坐骑由不同的商人出售,可以携带武器,但坐骑不能

在代码中标记顶级层以进行特殊处理的最佳方法是什么

  • 虽然顶层类别相对固定,但我希望将它们保留在DB中,这样使用单个(递归)函数更容易生成完整的可视化层次结构
  • 几乎所有标识项的外键也可能标识项类别,因此将它们分隔到不同的表中似乎非常笨拙
我的想法。
  • 我可以在名称上使用字符串匹配,并在第一次执行时将id存储在内部常量中。这是一个我最想避免的丑陋的解决方案
  • 我可以在安装时将id存储在一个内部常量中。更好,但仍然不是我喜欢的
  • 我可以将数组存储在顶级元素的代码中,而不是将它们放在表中。这就产生了很多复杂问题,比如孩子如何指向顶级家长。必须将另一个id添加到表中,该表由10K行中的100行使用
  • 我可以在代码中存储数组,并在安装时启用identity insert,以添加共享静态数组标识的顶级元素。也许是我最好的主意,但我不太喜欢身份插入的想法,只是我觉得它不像“数据库”。另外,如果出现新的顶级项目,该怎么办。这些类别的ID可能会从1百万开始
  • 我可以添加一个标志列“varchar(1)top_category”或“int top_category”,并使用字符或位图指示该值。同样,一列用于10k行中的10行
  • 作为一个软件人,我倾向于完善软件解决方案,因此我很好奇他们的解决方案是否更符合DB类型。

    是的,你可以把所有东西放在一张桌子上。您只需要为每个场景建立唯一的行。这给了你一个例子。。。但是IMO它开始变得难以理解。这并没有考虑所有的场景,因为无法进行完全连接(只有SQLFIDLE的一个限制,否则会很糟糕)

    在我看来,将事情分解成表格更有意义。下面是我如何开始为您描述的一些场景进行模式设计的示例

    基本表本身看起来很笨重,但它为数据的使用提供了更大的灵活性

    tl;前面是dr类比

    数据集不是按行组织的装备列表。这是你存放衣服的地方

    因此,将事物分解成单独的表的笨拙感觉实际上是关系数据库的好处。将所有内容放在一张表中,一开始感觉效率很高,而且经过了优化。。。但随着复杂性的扩大。。。它开始成为一种痛苦

    把你的模式想象成一个梳妆台。抽屉是你的桌子。如果你只有几只袜子和内衣,那么把它们放在一个抽屉里是很有效的。但是一旦你有了足够的袜子,把它们和内衣放在同一个抽屉里会很痛苦。你们有连衣裙袜、圆领袜、脚踝袜、毛绒袜。所以你把它们放在另一个抽屉里。一旦你有了衬衫、短裤、裤子,你也开始把它们放在抽屉里

    将所有数据放入单个表的驱动器通常由您打算如何使用数据驱动

    假设你的梳妆台存货充足,组织整齐,你就有几种潜在的独特服装;所有的东西都整齐地摆放在你的梳妆台上。你只需要把它们放在一起。选择并连接你将组装这些装备。事实上,你最喜欢的牛仔裤/t恤/袜子组合并非都在一个抽屉里,这并不意味着它笨重或低效。事实上,它们是分离和组织的,因此您可以: 1.快速了解从何处获取每件商品 2.查看其他可能的最喜爱组合 3.快速查看您装备的每个组成部分

    选择先考虑这套衣服,然后再考虑以后如何收拾,这没什么错。如果你只有一套衣服,把所有的东西放在一个抽屉里要比把每件衣服放在一个单独的抽屉里容易得多。然而,当你扩大你的衣柜时,装所有东西的单一抽屉开始变得效率低下


    您通常希望规划扩展和多功能性。您的程序可以根据需要将数据放在一起。一个组织良好的模式可以为您做到这一点。是否使用ORM并进行模型驱动的数据存储;或者从模式开始,然后基于模式构建模型;数据需求变得越复杂;这两种方法越相似。

    关系数据库旨在将实体存储在相互关联的表中。您经常会看到由部门、员工、工作等组成的公司数据库的示例,或者包含产品、客户、订单和供应商的商店的示例

    查询此类数据库非常容易,例如获取在特定部门从事特定工作的所有员工:

    select *
    from employees
    where job_id = (select id from job where name = 'accountant')
    and dept_id = select id from departments where name = 'buying');
    
    另一方面,您只有一个包含“things”的表。一行可以与另一行关联,意思是“属于类型”。你可以称这张桌子为“某物”。如果是关于公司数据的,我们就可以这样得到这份工作:

    select * 
    from something
    where description = 'accountant'
    and parent_id = (select id from something where description = 'job');
    
    因此,本署:

    select * 
    from something
    where description = 'buying'
    and parent_id = (select id from something where description = 'department');
    
    这两人仍需由在dep工作的人员联系
    select * 
    from something
    where description = 'buying'
    and parent_id = (select id from something where description = 'department');