elección de la base de datos para implementar un programa para recuperar 10 preguntas votadas en una sesión en vivo

Estoy implementando un programa que permitirá a la gente hacer preguntas durante un webinar y votar sobre preguntas. Estas preguntas pueden ser hasta 5 millones en total durante una hora de tiempo webinar. Y cada pregunta puede tener 1-100 votos. Estoy explorando opciones para seleccionar una base de datos correcta y un motor de procesamiento para calcular las 10 preguntas principales. Basado en mi entendimiento cassandra puede satisfacer algunas de las necesidades como los escritos rápidos y los datos incrementales. Puedo particionar en el cuestionario (la clave primaria) y timeuid (la clave del elemento) (para cada voto). También puedo tener una contraestática presentada para la cuenta de voto para cada pregunta. Donde estoy atascado es encontrar 10 preguntas principales a través de todas estas particiones. Cassandra no apoya esta consulta. ¿Podría alguien por favor compartir pensamientos sobre esto?

Gracias.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por devguru123


3 Respuestas:

  • Daré un ejemplo para Redis. Se puede lograr en un único conjunto clasificado o un conjunto clasificado + hash.

    Usted puede mantener los votos en score de conjuntos ordenados y preguntas como member. Cada vez que aumenta el voto, usted llama ZINCRBY para aumentar la puntuación(votes) de la pregunta. Cuando usted quiere conseguir arriba votado n preguntas que utiliza ZREVRANGE.

    Aquí está la demo para un único conjunto ordenado;

    127.0.0.1:6379> ZINCRBY votes 1 "my question"
    "1"
    127.0.0.1:6379> ZINCRBY votes 1 "my question"
    "2"
    127.0.0.1:6379> ZINCRBY votes 1 "my question"
    "3"
    127.0.0.1:6379> ZINCRBY votes 1 "my another question"
    "1"
    127.0.0.1:6379> ZINCRBY votes 1 "my another question"
    "2"
    127.0.0.1:6379> ZINCRBY votes 1 "yet another question"
    "1"
    127.0.0.1:6379> ZINCRBY votes 1 "my question"
    "4"
    127.0.0.1:6379> ZINCRBY votes 1 "yet another questionssss"
    "1"
    127.0.0.1:6379> ZREVRANGE votes 0 2 WITHSCORES
    1) "my question"
    2) "4"
    3) "my another question"
    4) "2"
    5) "yet another questionssss"
    6) "1"
    127.0.0.1:6379>
    

    Otra combinación se clasifica con hash. Las preguntas se guardan en el hash. Necesitas generar id para las preguntas en el hash. cuando tú ZINCRBYUsted usa la pregunta id como miembro. Entonces cuando necesites buscar las preguntas más votadas que uses ZREVRANGE para conseguir los ids y luego utilizar HMGET para conseguir preguntas de los ids dados.

    Respondida el Dec 19, 2020 a las 18:52 - por quantumcoderd26d

    Votos positivos: 0 | Votos negativos: 0

  • Para un caso como el que estás describiendo, donde necesitas recuperar las 10 preguntas principales con sus respectivos votos de entre posiblemente millones de preguntas y votos, Cassandra puede no ser la mejor opción debido a sus limitaciones en consultas complejas y ordenamiento.

    Te recomendaría considerar el uso de una base de datos como Elasticsearch, que está optimizada para búsquedas y consultas rápidas. Con Elasticsearch podrías indexar tus preguntas y votos de una manera eficiente y luego utilizar consultas para recuperar las 10 preguntas principales basadas en la cantidad de votos que hayan recibido.

    Otra opción sería utilizar una combinación de bases de datos, como por ejemplo guardar los datos en Cassandra para las escrituras rápidas y la escalabilidad, y luego utilizar un motor de procesamiento de datos como Apache Spark para calcular las 10 preguntas principales de forma periódica o en tiempo real.

    En resumen, para tu caso específico te sugiero considerar una base de datos optimizada para consultas rápidas y complejas, como Elasticsearch, o combinar diferentes tecnologías para cubrir todas las necesidades de tu aplicación.

    Respondida el Dec 20, 2020 a las 18:51 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Opciones de base de datos y motores de procesamiento:

    Apache Cassandra: Una base de datos NoSQL distribuida que se adapta bien a grandes conjuntos de datos y escrituras rápidas. Apache Spark: Un motor de procesamiento distribuido que se puede utilizar para analizar conjuntos de datos masivos.

    Estrategia de particionamiento:

    Particionar por webinar_id (clave primaria) y timestamp (clave de fila). Esto asegurará una distribución uniforme de los datos y permitirá consultas eficientes basadas en el tiempo. Crear una contracolumna para almacenar el recuento de votos para cada pregunta.

    Consulta de las 10 preguntas principales:

    Cassandra no admite consultas que abarquen particiones directamente. Sin embargo, puedes utilizar las siguientes estrategias:

    Materialized Views (Vistas Materializadas): Crea una vista materializada que agregue los votos de todas las particiones. Esto permitirá consultar las 10 preguntas principales de forma eficiente. UDF (Funciones Definidas por el Usuario): Escribe una UDF que tome una lista de filas como entrada y devuelva las 10 filas principales. Esta UDF se puede utilizar en una consulta para obtener las 10 preguntas principales. SparkSQL: Utiliza SparkSQL para leer los datos de Cassandra y realizar la agregación y el ordenamiento para obtener las 10 preguntas principales.

    Implementación:

    • Utiliza Cassandra para almacenar los datos de las preguntas y los votos.
    • Crea una vista materializada o una UDF para calcular las 10 preguntas principales.
    • Utiliza una herramienta de interfaz de usuario o una API para permitir a los usuarios ver las 10 preguntas principales en tiempo real.

    Ventajas de utilizar SparkSQL:

    Permite consultas complejas que abarcan particiones. Proporciona un lenguaje SQL familiar para consultas. Puede integrarse fácilmente con Cassandra mediante conectores.

    Respondida el Dec 20, 2020 a las 19:02 - por Gemini

    Votos positivos: 0 | Votos negativos: 0