Search code examples
rediskey-valuediagram

What is the standard way to diagram a redis (key-value) data structure?


I am working on creating a redis (key-value) database, and I want to be able to easily change the diagram which represents how the data should be stored. Included in this diagram I want to be able to distinguish data which is saved as a string of JSON, vs that which is actually a hash table, or a set or an ordered set.

I tried writing something up in excel, but it was too much like a relational database, I tried writing it in JSON but it was hard to tell what was a value of a JSON string, and which were hashes.

Is there an industry standard on how to diagram this?

EDIT: I ended up making my own syntax, but would still like to know the answer to this.


Solution

  • This is the syntax I created for myself: (And here is a sample Redis structure of a card game I was going to make: http://pastebin.com/4aRye4HQ)

    key:   = string
    #key:  = hash
    $key:  = set
    $$key: = sortedSet
    

    This is the Sublime syntax highlighting file I used to color code the syntax (Saved as redis.YAML-tmLanguage ):

        # [PackageDev] target_format: plist, ext: tmLanguage
    ---
    name: Redis
    scopeName: source.redis
    fileTypes: []
    uuid: 0033bdf9-cd9f-4147-bd2e-a9fed3d07e1e
    
    patterns:
    - include: '#erb'
    - match: \#[A-Za-z][A-Za-z0-9_]+
      name: variable.parameter
      comment: Hashes
    - match: \$[A-Za-z][A-Za-z0-9_]+
      name: support.constant
      comment: Sets
    - match: \$\$[A-Za-z][A-Za-z0-9_]+
      name: entity.name.class
      comment: Sets
    - match: \d+
      name: constant.numeric
      comment: Numbers
    
    
    - name: constant.numeric.yaml
      match: (?:(?:(-\s*)?(\w+\s*(:)))|(-))\s*((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\s*$
      captures:
        '1': {name: punctuation.definition.entry.yaml}
        '2': {name: entity.name.tag.yaml}
        '3': {name: punctuation.separator.key-value.yaml}
        '4': {name: punctuation.definition.entry.yaml}
    
    - name: string.unquoted.yaml
      match: (?:(?:(-\s*)?(\w+\s*(:)))|(-))\s*(?:((")[^"]*("))|((')[^']*('))|([^,{}&#\[\]]+))\s*
      captures:
        '1': {name: punctuation.definition.entry.yaml}
        '2': {name: entity.name.tag.yaml}
        '3': {name: punctuation.separator.key-value.yaml}
        '4': {name: punctuation.definition.entry.yaml}
        '5': {name: string.quoted.double.yaml}
        '6': {name: punctuation.definition.string.begin.yaml}
        '7': {name: punctuation.definition.string.end.yaml}
        '8': {name: string.quoted.single.yaml}
        '9': {name: punctuation.definition.string.begin.yaml}
        '10': {name: punctuation.definition.string.end.yaml}
        '11': {name: string.unquoted.yaml}
    
    - name: constant.other.date.yaml
      match: (?:(?:(-\s*)?(\w+\s*(:)))|(-))\s*([0-9]{4}-[0-9]{2}-[0-9]{2})\s*$
      captures:
        '1': {name: punctuation.definition.entry.yaml}
        '2': {name: entity.name.tag.yaml}
        '3': {name: punctuation.separator.key-value.yaml}
        '4': {name: punctuation.definition.entry.yaml}
    - include: '#value'
    
    repository:
      array:
        name: meta.structure.array.json
        begin: \[
        beginCaptures:
          '0': {name: punctuation.definition.array.begin.json}
        end: \]
        endCaptures:
          '0': {name: punctuation.definition.array.end.json}
        patterns:
        - include: '#value'
        - name: punctuation.separator.array.json
          match: ','
        - name: invalid.illegal.expected-array-separator.json
          match: '[^\s\]]'
    
      comments:
        patterns:
        - name: comment.block.documentation.json
          begin: /\*\*
          end: \*/
          captures:
            '0': {name: punctuation.definition.comment.json}
        - name: comment.block.json
          begin: /\*
          end: \*/
          captures:
            '0': {name: punctuation.definition.comment.json}
        - name: comment.line.double-slash.js
          match: (//).*$\n?
          captures:
            '1': {name: punctuation.definition.comment.json}
    
      constant:
        name: constant.language.json
        match: \b(?:true|false|null)\b
    
      number:
        comment: handles integer and decimal numbers
        name: constant.numeric.json
        match: "(?x:         # turn on extended mode\n\t\t\t             -?         #\
          \ an optional minus\n\t\t\t             (?:\n\t\t\t               0        #\
          \ a zero\n\t\t\t               |        # ...or...\n\t\t\t               [1-9]\
          \    # a 1-9 character\n\t\t\t               \\d*      # followed by zero or\
          \ more digits\n\t\t\t             )\n\t\t\t             (?:\n\t\t\t        \
          \       (?:\n\t\t\t                 \\.     # a period\n\t\t\t             \
          \    \\d+    # followed by one or more digits\n\t\t\t               )?\n\t\t\
          \t               (?:\n\t\t\t                 [eE]   # an e character\n\t\t\t\
          \                 [+-]?  # followed by an option +/-\n\t\t\t               \
          \  \\d+    # followed by one or more digits\n\t\t\t               )?       #\
          \ make exponent optional\n\t\t\t             )?         # make decimal portion\
          \ optional\n\t\t\t           )"
    
      object:
        comment: a JSON object
        name: meta.structure.dictionary.json
        begin: \{
        beginCaptures:
          '0': {name: punctuation.definition.dictionary.begin.json}
        end: \}
        endCaptures:
          '0': {name: punctuation.definition.dictionary.end.json}
        patterns:
        - comment: the JSON object key
          include: '#string'
        - include: '#comments'
        - name: meta.structure.dictionary.value.json
          begin: ':'
          beginCaptures:
            '0': {name: punctuation.separator.dictionary.key-value.json}
          end: (,)|(?=\})
          endCaptures:
            '1': {name: punctuation.separator.dictionary.pair.json}
          patterns:
          - comment: the JSON object value
            include: '#value'
          - name: invalid.illegal.expected-dictionary-separator.json
            match: '[^\s,]'
        - name: invalid.illegal.expected-dictionary-separator.json
          match: '[^\s\}]'
    
      string:
        name: string.quoted.double.json
        begin: '"'
        beginCaptures:
          '0': {name: punctuation.definition.string.begin.json}
        end: '"'
        endCaptures:
          '0': {name: punctuation.definition.string.end.json}
        patterns:
        - name: constant.character.escape.json
          match: |-
            (?x:                # turn on extended mode
                                 \\                # a literal backslash
                                 (?:               # ...followed by...
                                   ["\\/bfnrt]     # one of these characters
                                   |               # ...or...
                                   u               # a u
                                   [0-9a-fA-F]{4}  # and four hex digits
                                 )
                               )
        - name: invalid.illegal.unrecognized-string-escape.json
          match: \\.
    
      value:
        comment: "the 'value' diagram at http://json.org"
        patterns:
        - include: '#constant'
        - include: '#number'
        - include: '#string'
        - include: '#array'
        - include: '#object'
        - include: '#comments'
    foldingStartMarker: |-
      (?x:       # turn on extended mode
                                ^        # a line beginning with
                                \s*      # some optional space
                                [{\[]    # the start of an object or array
                                (?!      # but not followed by
                                  .*     # whatever
                                  [}\]]  # and the close of an object or array
                                  ,?     # an optional comma
                                  \s*    # some optional space
                                  $      # at the end of the line
                                )
                                |        # ...or...
                                [{\[]    # the start of an object or array
                                \s*      # some optional space
                                $        # at the end of the line
                              )
    foldingStopMarker: |-
      (?x:     # turn on extended mode
                               ^      # a line beginning with
                               \s*    # some optional space
                               [}\]]  # and the close of an object or array
                             )
    keyEquivalent: ^~J
    
    ...